Quelle est la différence entre $ host et $ http_host dans Nginx

Réponses:

217

$hostest une variable du module Core .

$ hôte

Cette variable est égale à la ligne Host dans l'en-tête de la requête ou au nom du serveur traitant la requête si l'en-tête Host n'est pas disponible.

Cette variable peut avoir une valeur différente de $ http_host dans de tels cas: 1) lorsque l'en-tête d'entrée Host est absent ou a une valeur vide, $ host est égal à la valeur de la directive server_name; 2) lorsque la valeur de Host contient le numéro de port, $ host n'inclut pas ce numéro de port. La valeur de $ host est toujours en minuscules depuis la 0.8.17.

$http_hostest également une variable du même module mais vous ne la trouverez pas avec ce nom car elle est définie de manière générique comme $http_HEADER( ref ).

$ http_HEADER

La valeur de l'en-tête de la requête HTTP HEADER lorsqu'il est converti en minuscules et avec les «tirets» convertis en «traits de soulignement», par exemple $ http_user_agent, $ http_referer ...;


En résumé:

  • $http_hostéquivaut toujours à l'en- HTTP_HOSTtête de la demande.
  • $hostest égal $http_host, en minuscules et sans le numéro de port (si présent), sauf en cas d' HTTP_HOSTabsence ou de valeur vide . Dans ce cas, $hostégale la valeur de la server_namedirective du serveur qui a traité la requête.
glarrain
la source
57
$ host est spécifiquement le premierserver_name défini dans le bloc serveur actuel. si vous avez plusieurs server_names, seul le premier apparaîtra.
Jonathan Vanasco
4
Vrai. En fait, il est assez courant de définir: nom_serveur example.com www.example.com;
glarrain
vous pouvez également avoir plusieurs server_namedirectives. si vous avez une regex dans la première, cela devient le $host, et toutes sortes de choses laides peuvent se produire pendant les règles de réécriture.
Jonathan Vanasco
5
La $server_namevariable est-elle égale à la server_namevaleur de la directive ou au nom de serveur réel qui a été sélectionné s'il y avait plusieurs server_namedirectives?
CMCDragonkai
1
@CMCDragonkai $server_nameest toujours égal à la première valeur spécifiée avec la directive nom_serveur. Par exemple, avec server_name example.com one.example.com two.example.com;, $server_namesera toujours "example.com", quel que soit l'hôte spécifié par l'utilisateur . En fait, si vous n'en avez pas default_server, l'hôte peut être quelque chose de complètement différent (comme example.org).
ATLief