【问题标题】:nginx - Subdomain as querystring parameter?nginx - 子域作为查询字符串参数?
【发布时间】:2016-01-16 20:23:13
【问题描述】:

我有一个简单的单页 Web 应用程序,它接受查询字符串参数 name。此 Web 应用程序当前打印参数的值;因此,http://example.com/app/?name=person1 处的页面显示文本 person1

我想使用 nginx 在内部将请求路由到 http://person1.example.com/http://example.com/app/?name=person1,以便检索到相同的文本。

理想情况下,我还想让子域的名称对 PHP 或 Node.js 进程可用,以便在不同的子域中重用相同的应用程序文件,从而允许应用程序本身根据任何一个在内部处理请求客户端当前正在访问的 URL。

但是,我想动态执行此操作 - 无需为每个子域设置新的虚拟主机。

这可以通过 nginx 上的动态虚拟主机来完成吗?如果可以,怎么做? 谁能指出我正确的方向,或帮助解释我正在努力理解的内容?

此外,还有比我正在尝试做的更好的选择吗?

【问题讨论】:

  • 这一切都发生在同一台服务器上吗?
  • @ColeTierney 我应该指定-是的,我想在同一台机器上运行 nginx 和 PHP-FPM 或 Node.js 并完成此操作。不知何故。我只是不知道该如何处理。

标签: nginx multi-tenant


【解决方案1】:

如果外部重定向没问题,我会尝试以下方法:

map $host $subdomain {
    ~^(?<sub>.+)\.[^\.]+\.[^\.]+$ $sub;
}

server {
    listen  80  default_server;
    server_name _;

    if ($subdomain) {
        return 301 http://example.com/app/?name=$subdomain;
    }
}

如果需要内部重定向,可能需要重写或 proxy_pass。

【讨论】:

  • 这看起来很有希望! map 是什么,那里发生了什么?正则表达式中有一些东西我无法区分,比如前面的&lt;sub&gt;
  • map 指令是使用正则表达式定义变量的有效场所。作者 Igor Sysoev 解释了为什么 over here。如果$host 变量中存在子域,&lt;sub&gt; 表达式将捕获子域并将其作为变量$subdomain 返回。正则表达式可以写成~^(?&lt;sub&gt;.+)\.example\.com$
  • 确认!我忙于功课,忘记接受你的回答。我很抱歉,再次感谢您的帮助!我不知道map 是什么,但它非常有用。
  • 没关系康纳!我喜欢尽我所能提供帮助。周而复始。
猜你喜欢
  • 2017-12-28
  • 2019-02-07
  • 2020-11-13
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
相关资源
最近更新 更多