Nginx 正则表达式虚拟主机模式最终作为 PHP 服务器名称

Nginx 正则表达式虚拟主机模式最终作为 PHP 服务器名称

我有一个带有正则表达式匹配的 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;
    ...
}

相关内容