[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