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.

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.