我有一个nginx服务器定义与正则expression式匹配,如下所示:
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托pipe各种PHP项目,在$_SERVER接收这样的值:
SERVER_NAME => "~^(?<vhost>[a-z0-9-]+)\.example\.com$" HTTP_HOST => "myhost.example.com"
正如你所看到的,正则expression式模式被放入SERVER_NAME而不是它匹配的string。 这对我来说似乎有点儿麻烦,也代表了一个安全风险,因为它揭示了不必要的细节(在其他configuration中我匹配一组特定的名称而不是通配符)。
你可能会说“使用HTTP_HOST而不是SERVER_NAME” – 如果只是这么简单的话 – 有些库希望SERVER_NAME(不奇怪)包含服务器的名字。 我无法真正看到这种行为的一个很好的用例。
感谢写这个问题的橡皮鸭效应,我find了一个解决scheme。
Nginx的股票fastcgi_params文件包含行:
fastcgi_param SERVER_NAME $server_name;
这就是导致该值出现在PHP环境的$_SERVER['SERVER_NAME']中的原因。
我改变了使用$主机variables :
fastcgi_param SERVER_NAME $host;
我的问题就消失了 我有兴趣知道这种方法是否有任何缺点。
server_name ~^(?<subdomain>.+)\.example\.com$; set $server_name_full $subdomain.example.com; location ~ \.php$ { ... include fastcgi_params; fastcgi_param SERVER_NAME $server_name_full; ... }