Was ist der Unterschied zwischen $ host und $ http_host in Nginx?

Antworten:

217

$hostist eine Variable des Core- Moduls.

$ host

Diese Variable entspricht der Zeile Host im Header der Anforderung oder dem Namen des Servers, der die Anforderung verarbeitet, wenn der Host-Header nicht verfügbar ist.

Diese Variable kann in folgenden Fällen einen anderen Wert als $ http_host haben: 1) Wenn der Host-Eingabekopf fehlt oder einen leeren Wert hat, entspricht $ host dem Wert der Direktive server_name; 2) Wenn der Wert von Host die Portnummer enthält, enthält $ host diese Portnummer nicht. Der Wert von $ host ist seit 0.8.17 immer klein geschrieben.

$http_hostist auch eine Variable desselben Moduls, aber Sie werden sie nicht mit diesem Namen finden, da sie generisch als $http_HEADER( ref ) definiert ist.

$ http_HEADER

Der Wert des HTTP-Anforderungsheaders HEADER bei Konvertierung in Kleinbuchstaben und bei Konvertierung von 'Strichen' in 'Unterstriche', z. B. $ http_user_agent, $ http_referer ...;


Zusammenfassend:

  • $http_hostentspricht immer dem HTTP_HOSTAnforderungsheader.
  • $hostgleich $http_host, klein geschrieben und ohne die Portnummer (falls vorhanden), außer wenn nicht HTTP_HOSTvorhanden oder ein leerer Wert ist . In diesem Fall $hostentspricht dies dem Wert der server_nameDirektive des Servers, der die Anforderung verarbeitet hat.
Glarrain
quelle
57
$ host ist speziell der ersteserver_name , der im aktuellen Serverblock definiert ist. Wenn Sie mehrere server_names haben, wird nur das erste angezeigt.
Jonathan Vanasco
4
Wahr. In der Tat ist es ziemlich typisch zu definieren: Servername example.com www.example.com;
Glarrain
Sie können auch mehrere server_nameAnweisungen haben. Wenn Sie im ersten einen regulären Ausdruck haben, wird dieser zum $hostund alle möglichen hässlichen Dinge können beim Umschreiben von Regeln passieren.
Jonathan Vanasco
5
Entspricht die $server_nameVariable dem server_nameWert der Direktive oder dem tatsächlichen Servernamen, der ausgewählt wurde, wenn mehrere server_nameDirektiven vorhanden waren ?
CMCDragonkai
1
@CMCDragonkai $server_nameist immer gleich dem ersten Wert, der mit der Anweisung server_name angegeben wurde. Mit Zum Beispiel server_name example.com one.example.com two.example.com;, $server_namewird immer „example.com“ sein, unabhängig davon , welcher Host der Benutzer festgelegt hat . Wenn Sie keine haben default_server, ist der Host möglicherweise etwas völlig anderes (wie example.org).
ATLief