具有多个 "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
指令块以...
开头
server {
server_name www.example1.com www.example2.com www.example3.com;
...为了让网站可以用不同的域名访问。
但是 PHP 的 $_SERVER['SERVER_NAME']
始终是 returns server_name
的第一个条目,在本例中是 http://www.example1.com
所以我无法从 PHP 代码知道用户使用哪个域访问该站点。
有什么办法可以让nginx/fastcgi传递访问网站的真实域名吗?
到目前为止,我找到的唯一解决方案是为每个域重复整个 server
块,并使用不同的 server_name
条目,但显然我正在寻找更好的方法。
这是有意为之的,正确的解决方案是在您的代码中使用 $_SERVER['HTTP_HOST']
。
您应该将 SERVER_NAME
解释为 已验证 服务器名称,将 HTTP_HOST
解释为可以很容易修改的用户输入,因此应该'值得信赖。
在您的 fastcgi_params
配置中设置 SERVER_NAME
以使用 $host
。
fastcgi_param SERVER_NAME $host;
来源:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_param
我的配置文件有一个 server
指令块以...
server {
server_name www.example1.com www.example2.com www.example3.com;
...为了让网站可以用不同的域名访问。
但是 PHP 的 $_SERVER['SERVER_NAME']
始终是 returns server_name
的第一个条目,在本例中是 http://www.example1.com
所以我无法从 PHP 代码知道用户使用哪个域访问该站点。
有什么办法可以让nginx/fastcgi传递访问网站的真实域名吗?
到目前为止,我找到的唯一解决方案是为每个域重复整个 server
块,并使用不同的 server_name
条目,但显然我正在寻找更好的方法。
这是有意为之的,正确的解决方案是在您的代码中使用 $_SERVER['HTTP_HOST']
。
您应该将 SERVER_NAME
解释为 已验证 服务器名称,将 HTTP_HOST
解释为可以很容易修改的用户输入,因此应该'值得信赖。
在您的 fastcgi_params
配置中设置 SERVER_NAME
以使用 $host
。
fastcgi_param SERVER_NAME $host;
来源:http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_param