Nginx 正则表达式 vhost 模式最终作为 PHP 服务器名称

Syn*_*hro 12 nginx

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

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

这一切都运行良好,但是,该域托管使用 fastcgi 和 PHP-FPM 的各种 PHP 项目,它们在$_SERVER以下位置接收如下值:

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

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

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

Syn*_*hro 14

感谢写这个问题的橡皮鸭效应,我找到了一个解决方案。

Nginx 的股票fastcgi_params文件包含以下行:

fastcgi_param  SERVER_NAME        $server_name;
Run Code Online (Sandbox Code Playgroud)

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

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

fastcgi_param  SERVER_NAME        $host;
Run Code Online (Sandbox Code Playgroud)

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