[proposal] SERVER_NAME в fastcgi_params
Maxim Dounin
mdounin на mdounin.ru
Пн Мар 13 08:56:49 UTC 2023
Hello!
On Mon, Mar 13, 2023 at 10:50:37AM +0300, Nikolay Shaplov wrote:
> В письме от понедельник, 13 марта 2023 г. 10:46:51 MSK пользователь Maksim
> Kulik написал:
> > Мне кажется, что в RFC речь идет скорее про разные блоки server {}, т.к.
> > речь явно про several virtual hosts, а не про several server names. То есть
> > веб-сервер вполне корректно по RFC выбирает блок server {} по имени хоста и
> > используется главное имя этого блока далее в работе.
> > Вы в своем примере имеете один виртуал хост и N имен (алиасов, если хотите)
> > в нем, где N может быть бесконечным в случае дефолтного хоста. Ваш сервер и
> > выбирает этот самый хост по имени, которое видит в заголовке.
> Правильно. И то имя которое совпало должно попасть в переменную окружения
> SERVER_NAME
>
> Ну даже если не читать сам текст RFC (а там по-моему предельно ясно все
> написано), из соображений общий логики, почему в SERVER_NAME попадает первый
> из алиасов, а не тот на который пришли??? В этом нет вообще никакой логики.
Потому что первое из имён, указанных в директиве server_name -
каноническое. Это, кстати, явно описано в документации
(https://nginx.org/ru/docs/http/ngx_http_core_module.html#server_name):
: Первое имя становится основным именем сервера.
Разделение на каноническое имя и алиасы - оно ещё из Apache, где
имя сервера указывается отдельно, директивой ServerName, а алиасы,
соответственно, директивой ServerAlias. В nginx'е всех отличий в
этом плане - алиасы задаются с помощью той же директивы
server_name.
Выбор же между "использовать каноническое имя" или "использовать имя,
на которое пришли" - это вопрос, в первую очередь, желаемого
поведения.
Скажем, мы можем хотеть во всех перенаправлениях / ссылках /
текстах использовать каноническое имя, чтобы пользователь получал
одно и то же, независимо от того, по какому конкретно имени он
пришёл. Например, это может быть важно, чтобы тексты
сгенерированных страниц всегда совпадали, и их можно было
кэшировать для всех пользователей. Или просто из эстетических
соображений.
Или наоборот, можем хотеть, чтобы пользователю всегда возвращались
ссылки ровно с тем именем, на которое он пришёл, потому что для
разных пользователей сайт может быть доступен под разными именами.
Что именно нужно в конкретной конфигурации - это решение того, кто
пишет конфигурацию nginx'а. В некоторых случаях оно явно вынесено
в отдельные директивы (см. упоминавшуюся ранее
server_name_in_redirect), в случае же CGI-like бэкендов оно
делается неявно с помощью задания переменной SERVER_NAME.
--
Maxim Dounin
http://mdounin.ru/
Подробная информация о списке рассылки nginx-ru