Qual é a diferença de $ host e $ http_host no Nginx

Respostas:

217

$hosté uma variável do módulo Core .

$ host

Essa variável é igual à linha Host no cabeçalho da solicitação ou no nome do servidor que está processando a solicitação, se o cabeçalho do Host não estiver disponível.

Essa variável pode ter um valor diferente de $ http_host nesses casos: 1) quando o cabeçalho de entrada Host estiver ausente ou tiver um valor vazio, $ host será igual ao valor da diretiva server_name; 2) quando o valor de Host contém o número da porta, $ host não inclui esse número da porta. O valor do $ host é sempre minúsculo desde 0.8.17.

$http_hosttambém é uma variável do mesmo módulo, mas você não o encontrará com esse nome porque ele é definido genericamente como $http_HEADER( ref ).

$ http_HEADER

O valor do cabeçalho da solicitação HTTP HEADER quando convertido em minúsculas e com 'traços' convertidos em 'sublinhados', por exemplo, $ http_user_agent, $ http_referer ...;


Resumindo:

  • $http_hosté sempre igual ao HTTP_HOSTcabeçalho da solicitação.
  • $hosté igual a $http_host, minúscula e sem o número da porta (se presente), exceto quando HTTP_HOSTestá ausente ou é um valor vazio . Nesse caso, $hosté igual ao valor da server_namediretiva do servidor que processou a solicitação.
glarrain
fonte
57
$ host é especificamente o primeiroserver_name definido no bloco do servidor atual. se você tiver vários server_names, apenas o primeiro aparecerá.
Jonathan Vanasco 14/03
4
Verdade. De fato, é bastante típico definir: nome_do_servidor exemplo.com www.exemplo.com;
glarrain
você também pode ter várias server_namediretivas. se você tiver uma regex no primeiro, isso se torna o $host, e todo tipo de coisa feia pode acontecer durante as regras de reescrita.
Jonathan Vanasco
5
A $server_namevariável é igual ao server_namevalor da diretiva ou ao nome real do servidor que foi selecionado se houver várias server_namediretivas?
CMCDragonkai
1
@CMCDragonkai $server_nameé sempre igual ao primeiro valor especificado com a diretiva server_name. Por exemplo, com server_name example.com one.example.com two.example.com;, $server_namesempre será "exemplo.com", independentemente de qual host o usuário especificou . De fato, se você não tiver um default_server, o host pode ser algo completamente diferente (como exemplo.org).
ATLief