В чем разница между $ host и $ http_host в Nginx?

Ответы:

217

$hostпеременная модуля Core

$ хост

Эта переменная равна строке Host в заголовке запроса или имени сервера, обрабатывающего запрос, если заголовок Host недоступен.

Эта переменная может иметь значение, отличное от $ http_host, в следующих случаях: 1) если входной заголовок Host отсутствует или имеет пустое значение, $ host равно значению директивы server_name; 2) когда значение Host содержит номер порта, $ host не включает этот номер порта. Значение $ host всегда строчное с 0.8.17.

$http_hostтакже является переменной того же модуля, но вы не найдете его с таким именем, поскольку оно определено как $http_HEADER( ref ).

$ http_HEADER

Значение заголовка HTTP-запроса HEADER при преобразовании в нижний регистр и с «черточками», преобразованными в «подчеркивания», например, $ http_user_agent, $ http_referer ...;


Подводя итог:

  • $http_hostвсегда равен HTTP_HOSTзаголовку запроса
  • $hostравно $http_host, в нижнем регистре и без номера порта (если присутствует), за исключением случаев, когда HTTP_HOSTотсутствует или является пустым значением . В этом случае $hostравно значению server_nameдирективы сервера, обработавшего запрос.
glarrain
источник
57
В частности, $ host является первым,server_name который определен в текущем блоке сервера. если у вас есть несколько server_names, появится только первый.
Джонатан Ванаско
4
Правда. На самом деле это довольно типично для определения: имя_сервера example.com www.example.com;
glarrain
Вы также можете иметь несколько server_nameдиректив. если у вас есть регулярное выражение в первом, оно становится $host, и во время правил перезаписи могут происходить все виды уродливых вещей.
Джонатан Ванаско
5
Соответствует ли $server_nameпеременная server_nameзначению директивы или фактическому имени сервера, которое было выбрано, если было несколько server_nameдиректив?
CMCDragonkai
1
@CMCDragonkai $server_nameвсегда равно первому значению, указанному в директиве server_name. Например, с server_name example.com one.example.com two.example.com;, $server_nameвсегда будет «example.com», независимо от того, какой хост указал пользователь . На самом деле, если у вас нет default_server, хост может быть чем-то совершенно другим (например, example.org).
ATLief