我有一个带有正则表达式匹配的 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(毫不奇怪)包含服务器的名称。我真的看不出这种行为有什么好的用例。
答案1
由于写这个问题的橡皮鸭效应,我找到了解决方案。
Nginx 的库存fastcgi_params
文件包含以下行:
fastcgi_param SERVER_NAME $server_name;
这就是导致该值出现$_SERVER['SERVER_NAME']
在 PHP 环境中的原因。
我将其改为使用$主机变量:
fastcgi_param SERVER_NAME $host;
我的问题就解决了。我很想知道这种方法是否有任何缺点。
答案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;
...
}