Was ist der Unterschied zwischen den drei Nginx Variablen $host
, $http_host
und $server_name
?
Ich habe eine Regel zum Umschreiben, bei der ich nicht sicher bin, welche ich verwenden soll:
location = /vb/showthread.php {
# /vb/showthread.php?50271-What-s-happening&p=846039
if ($arg_p) {
return 301 $scheme://$host/forum/index.php?posts/$arg_p/;
}
Ich suche nach einer Antwort, die nicht nur "benutze ___ Variable in deiner Umschreiberegel" sagt, sondern auch die theoretischen Unterschiede zwischen ihnen erklärt.
$scheme
und$host
... gutreturn 301 /forum/index.php?posts/$arg_p/;
funktioniert.Location
Kopfzeile.Antworten:
Sie sollten fast immer verwenden
$host
, da dies die einzige ist, die unabhängig vom Verhalten des Benutzeragenten einen Sinn ergibt, es sei denn, Sie benötigen speziell die Semantik einer der anderen Variablen.Der Unterschied wird in der Nginx-Dokumentation erklärt :
$host
enthält "in dieser Rangfolge: Hostname aus der Anforderungszeile oder Hostname aus dem Anforderungsheaderfeld" Host "oder den Servernamen, der einer Anforderung entspricht"$http_host
Enthält den Inhalt des HTTP-Headerfelds "Host", sofern es in der Anforderung vorhanden war$server_name
Enthält denserver_name
des virtuellen Hosts, der die Anforderung verarbeitet hat, wie er in der nginx-Konfiguration definiert wurde. Wenn aserver
mehrereserver_name
s enthält , ist in dieser Variablen nur das erste vorhanden.Da es für Benutzeragenten zulässig ist, den Hostnamen in der Anforderungszeile und nicht in einem Host: -Header zu senden, müssen Sie dies berücksichtigen, auch wenn dies nur bei der Verbindung mit Proxys geschieht.
Sie müssen auch den Fall berücksichtigen, dass der Benutzeragent überhaupt keinen Hostnamen sendet, z. B. alte HTTP / 1.0-Anforderungen und moderne, schlecht geschriebene Software. Sie können dies tun, indem Sie sie an einen virtuellen Catch-All-Host umleiten, der nichts bedient, wenn Sie mehrere Websites bedienen oder wenn Sie nur eine einzige Website auf Ihrem Server haben, können Sie alles über einen einzelnen virtuellen Host verarbeiten . Im letzteren Fall müssen Sie dies ebenfalls berücksichtigen.
Nur die
$host
Variable berücksichtigt alle möglichen Aktionen, die ein Benutzeragent beim Bilden einer HTTP-Anforderung ausführen kann.quelle
$server_name
sicher, wenn einHost:
Feld von UA beliebigen Inhalt enthalten kann.Ich möchte einen weiteren wichtigen Punkt hinzufügen, der in der akzeptierten Antwort nicht erwähnt wird.
$host
Sie NICHT Portnummer haben, während$http_host
DO die Portnummer enthalten.bearbeiten : nicht immer.
Ich habe immer einen Header "add_header Y-blog-http_host" $ http_host "eingerichtet."
Dann
curl -I -L domain.com:80
(oder 443) und der Header zeigen überhaupt keine Portnummer an. Verifiziert mit nginx-extra 1.10.3. Liegt es daran, dass es sich um gebräuchliche http (s) -Ports oder Nginx-Konfigurationen handelt? Dieser Kommentar soll nur sagen, dass sich die Dinge nicht immer so verhalten, wie Sie denken.quelle
Ich hatte auch eine Weile damit zu kämpfen. Es wurde klar, als ich verstand, dass sich $ http_XXXXX auf alle deklarierten Header-Variablen bezieht.
$ Http_user_agent, $ http_referer sind also "USER AGENT", "REFERER" in Kleinbuchstaben und Unterstrich. Dies erklärte mir, wo zum Teufel $ http_upgrade in vielen NGINX-Konfigurationsbeispielen herkam.
Lesen Sie es unter https://stackoverflow.com/questions/15414810/whats-the-difference-of-host-and-http-host-in-nginx
quelle