У меня есть определение сервера nginx с совпадением регулярного выражения, например:
server_name ~^(?<vhost>[a-z0-9-]+)\.example\.com$;
root /var/www/example/$vhost;
access_log /var/log/nginx/$vhost.example-access.log;
Все это прекрасно работает, однако в этом домене размещаются различные проекты PHP, использующие fastcgi и PHP-FPM, которые получают такие значения в $_SERVER
:
SERVER_NAME => "~^(?<vhost>[a-z0-9-]+)\.example\.com$"
HTTP_HOST => "myhost.example.com"
Как видите, шаблон регулярного выражения помещается в SERVER_NAME
а не строку, которой он соответствует. Мне это кажется немного ошибочным, а также представляет угрозу безопасности, так как раскрывает ненужные детали (в других конфигурациях я использую определенный набор имен, а не подстановочный знак).
Вы могли бы сказать «используйте HTTP_HOST вместо SERVER_NAME» - если бы это было так просто - есть библиотеки, которые ожидают, что SERVER_NAME (неудивительно) будет содержать имя сервера. Я не вижу хорошего варианта использования такого поведения.
Благодаря эффекту резиновой утки при написании этого вопроса я нашел решение.
Акции Nginx fastcgi_params
файл содержит строку:
fastcgi_param SERVER_NAME $server_name;
из-за чего это значение появляется в $_SERVER['SERVER_NAME']
в среде PHP.
Я изменил это, чтобы использовать переменная $ host:
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;
...
}