【问题标题】: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 我当然可以这样做,但这正是我想要避免的(复制相同的配置文件)

标签: php nginx configuration fastcgi


【解决方案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 之间的区别非常有用,如果您了解区别
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
相关资源
最近更新 更多