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