Шаблон Vhost регулярного выражения Nginx заканчивается как имя сервера PHP

12

У меня есть определение сервера 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 (не удивительно) будет содержать имя сервера. Я действительно не вижу хорошего варианта использования этого поведения.

Синхронная
источник

Ответы:

14

Благодаря эффекту резиновой утки при написании этого вопроса я нашел решение.

Исходный fastcgi_paramsфайл Nginx содержит строку:

fastcgi_param  SERVER_NAME        $server_name;

именно поэтому это значение появляется $_SERVER['SERVER_NAME']в среде PHP.

Я изменил это, чтобы использовать переменную $ host :

fastcgi_param  SERVER_NAME        $host;

и моя проблема ушла. Мне было бы интересно узнать, есть ли недостатки этого подхода.

Синхронная
источник
Единственным недостатком этого подхода является то, что он полагается на переменную $ host, что означает, что он может быть перезаписан пользователем, если он отправит заголовок HTTP_HOST. Вы можете проверить это с помощью curl: curl --header "HOST: google.com" http://yourdomain/yourpage.phpи в yourpage.php поставить: <?php echo $_SERVER['SERVER_NAME']; ?>вы увидите google.com
Гулам Али
2
server_name  ~^(?<subdomain>.+)\.example\.com$;
set $server_name_full $subdomain.example.com;


location ~ \.php$ {
    ...
    include fastcgi_params;
    fastcgi_param SERVER_NAME $server_name_full;
    ...
}
Filippok
источник
3
Хотя код ценится, у него всегда должно быть сопутствующее объяснение. Это не должно быть долго, но это ожидается.
Петер - Восстановить Монику