Nginx正则表达式虚拟主机模式最终以PHP服务器名称结尾


12

我有一个带有正则表达式匹配项的nginx服务器定义,如下所示:

server_name ~^(?<vhost>[a-z0-9-]+)\.example\.com$;
root /var/www/example/$vhost;
access_log /var/log/nginx/$vhost.example-access.log;

一切都很好,但是,此域使用fastcgi和PHP-FPM托管各种PHP项目,它们在$_SERVER以下项中接收类似的值:

SERVER_NAME => "~^(?<vhost>[a-z0-9-]+)\.example\.com$"
HTTP_HOST   => "myhost.example.com"

如您所见,正则表达式模式SERVER_NAME而不是匹配的字符串被放入。对我来说,这似乎有点毛病,而且还存在安全风险,因为它泄露了不必要的细节(在其他配置中,我匹配的是一组特定的名称,而不是通配符)。

您可能会说“使用HTTP_HOST而不是SERVER_NAME”(如果就这么简单),有些库希望SERVER_NAME(毫无意外)包含服务器的名称。我真的看不到这种行为的好用例。

Answers:


14

多亏了写这个问题的笨蛋效应,我找到了一个解决方案。

Nginx的库存fastcgi_params文件包含以下行:

fastcgi_param  SERVER_NAME        $server_name;

这就是导致该值出现在$_SERVER['SERVER_NAME']PHP环境中的原因。

我将其更改为使用$ host变量

fastcgi_param  SERVER_NAME        $host;

我的问题就消失了。我想知道这种方法是否有缺点。


这种方法的唯一缺点是,它依赖于$ host变量,这意味着如果用户发送HTTP_HOST标头,它可以被用户覆盖。您可以使用curl进行测试:curl --header "HOST: google.com" http://yourdomain/yourpage.php并在yourpage.php中输入:<?php echo $_SERVER['SERVER_NAME']; ?>您将看到google.com
Ghulam Ali,

2
server_name  ~^(?<subdomain>.+)\.example\.com$;
set $server_name_full $subdomain.example.com;


location ~ \.php$ {
    ...
    include fastcgi_params;
    fastcgi_param SERVER_NAME $server_name_full;
    ...
}

3
尽管可以理解该代码,但应始终附有解释。这不必很长,但是可以预期。
彼得-恢复莫妮卡2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.