Назад | Перейти на главную страницу

Шаблон vhost регулярного выражения 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;

Все это прекрасно работает, однако в этом домене размещаются различные проекты 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;
    ...
}