Jaka jest różnica między $ host a $ http_host w Nginx

Odpowiedzi:

217

$hostjest zmienną modułu Core .

$ host

Ta zmienna jest równa wierszowi Host w nagłówku żądania lub nazwie serwera przetwarzającego żądanie, jeśli nagłówek Host nie jest dostępny.

Ta zmienna może mieć inną wartość niż $ http_host w takich przypadkach: 1) gdy nagłówek wejściowy Host jest nieobecny lub ma pustą wartość, $ host jest równe wartości dyrektywy server_name; 2) gdy wartość Host zawiera numer portu, $ host nie zawiera tego numeru portu. Wartość $ host jest zawsze pisana małymi literami od 0.8.17.

$http_hostjest również zmienną tego samego modułu, ale nie znajdziesz jej o tej nazwie, ponieważ jest zdefiniowana generalnie jako $http_HEADER( ref ).

$ http_HEADER

Wartość nagłówka żądania HTTP HEADER po przekonwertowaniu na małe litery iz „myślnikami” zamienionymi na „podkreślenia”, np. $ Http_user_agent, $ http_referer ...;


Zreasumowanie:

  • $http_hostrówna się zawsze HTTP_HOSTnagłówkowi żądania.
  • $hostrówna się $http_host, małe litery i bez numeru portu (jeśli jest obecny), z wyjątkiem sytuacji, gdy HTTP_HOSTjest nieobecny lub jest wartością pustą . W takim przypadku $hostjest równa wartości server_namedyrektywy serwera, który przetworzył żądanie.
glarrain
źródło
57
$ host jest dokładnie pierwszym,server_name który jest zdefiniowany w bieżącym bloku serwera. jeśli masz wiele server_names, pojawi się tylko pierwszy.
Jonathan Vanasco,
4
Prawdziwe. W rzeczywistości dość typowe jest zdefiniowanie: nazwa_serwera example.com www.example.com;
glarrain
możesz mieć również wiele server_namedyrektyw. jeśli zdarzy się, że masz wyrażenie regularne w pierwszym, to staje się ono $host, a podczas przepisywania reguł mogą się zdarzyć różne brzydkie rzeczy.
Jonathan Vanasco
5
Czy $server_namezmienna jest równa wartości server_namedyrektywy lub rzeczywistej nazwie serwera, która została wybrana, jeśli było wiele server_namedyrektyw?
CMCDragonkai
1
@CMCDragonkai $server_namejest zawsze równa pierwszej wartości określonej w dyrektywie server_name. Na przykład w przypadku server_name example.com one.example.com two.example.com;, $server_namezawsze będzie to „example.com”, niezależnie od hosta określonego przez użytkownika . W rzeczywistości, jeśli nie masz default_server, hostem może być coś zupełnie innego (na przykład example.org).
ATLief