带有多个“server_name”条目的 nginx“server”指令:始终将第一个传递给 PHP 的 $_SERVER['SERVER_NAME']
Posted
技术标签:
【中文标题】带有多个“server_name”条目的 nginx“server”指令:始终将第一个传递给 PHP 的 $_SERVER[\'SERVER_NAME\']【英文标题】:nginx "server" directive with multiple "server_name" entries: always first one is passed to PHP's $_SERVER['SERVER_NAME']带有多个“server_name”条目的 nginx“server”指令:始终将第一个传递给 PHP 的 $_SERVER['SERVER_NAME'] 【发布时间】:2015-10-07 09:10:47 【问题描述】:我的配置文件有一个以...开头的server
指令块
server
server_name www.example1.com www.example2.com www.example3.com;
...为了让网站可以被不同的域名访问。
但是 php 的 $_SERVER['SERVER_NAME']
总是返回 server_name
的第一个条目,在本例中为 http://www.example1.com
所以我无法从 PHP 代码中知道用户使用哪个域访问该站点。
有什么方法可以告诉 nginx/fastcgi 传递用于访问网站的真实域名?
到目前为止,我发现的唯一解决方案是为每个域重复整个 server
块,并使用不同的 server_name
条目,但显然我正在寻找更好的解决方案。
【问题讨论】:
也许在你的代码中使用 Host 代替 -wiki.nginx.org/HttpCoreModule#.24host 为什么不在 nginx 下的 \etc\nginx\sites-available 下创建 3 个站点配置文件,每个站点都指向同一个位置? @maytham 我当然可以这样做,但这正是我想要避免的(复制相同的配置文件) 【参考方案1】:将SERVER_NAME
设置为在您的fastcgi_params
配置中使用$host
。
fastcgi_param SERVER_NAME $host;
来源:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_param
【讨论】:
对你投了赞成票,但为什么这不是默认行为,对我来说似乎是合乎逻辑的。为什么它使用 server_name 块中的第一项。 始终在include fastcgi_params;
语句之后声明 fastcgi_param
语句以避免配置文件中的任何歧义。【参考方案2】:
这是有意的,正确的解决方案是在您的代码中使用$_SERVER['HTTP_HOST']
。
您应该将SERVER_NAME
解释为已验证 服务器名称,并将HTTP_HOST
解释为可以很容易修改的用户输入,因此不应被信任。
【讨论】:
谢谢。这是最简单的解决方案,我可能会使用它。但是,我更愿意找到一种使用'SERVER_NAME'
的方法,因为它是虚拟主机的名称,因为它被定义为 nginx 处理应用配置指令的请求。 'HTTP_HOST'
直接来自请求标头(如果客户端发送了它)。当然,正确配置的 nginx 会拒绝带有错误 http 主机标头的请求,从而使 'HTTP_HOST'
可靠...
我了解您正在尝试在您的 nginx 配置中进行某种部分验证;但就像您提到的那样,正确配置的 nginx 将只允许 valid HTTP_HOST 条目。像其他用户输入一样将 HTTP_* 视为不受信任仍然是一个好主意。 SERVER_NAME
和 HTTP_HOST
之间的区别非常有用,如果您了解区别以上是关于带有多个“server_name”条目的 nginx“server”指令:始终将第一个传递给 PHP 的 $_SERVER['SERVER_NAME']的主要内容,如果未能解决你的问题,请参考以下文章