带有多个“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_NAMEHTTP_HOST 之间的区别非常有用,如果您了解区别

以上是关于带有多个“server_name”条目的 nginx“server”指令:始终将第一个传递给 PHP 的 $_SERVER['SERVER_NAME']的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL:将选择从一个表插入另一个表,其中用户有多个带有订单号的条目

多个条目同名html表单

合并多个表中的最新条目

在单个片段事务中添加多个返回堆栈条目

nginx 配置文件

表单/表格中的 SwiftUI 多个 NavigationLink - 条目保持突出显示