Frage Was ist der Unterschied zwischen den Nginx-Variablen $ host, $ http_host und $ server_name?


Was ist der Unterschied zwischen den drei Nginx-Variablen? $host, $http_host, und $server_name?

Ich habe eine Rewrite-Regel, bei der ich mir 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 sagt "___ Variable in Ihrer Rewrite-Regel verwenden", sondern erklärt auch die theoretischen Unterschiede zwischen ihnen.


29
2017-07-17 01:50


Ursprung


Ich erkannte später, dass ich nicht einmal angeben musste $scheme und $host... return 301 /forum/index.php?posts/$arg_p/; funktioniert gut. - Jeff Widman
Der meiste Browser würde mit relativer URL in Redirect arbeiten, aber der Standard (w3.org/Protocols/rfc2616/rfc2616-sec14.html) benötigt absolute URL in der Location Header. - Cthulhu


Antworten:


Du solltest fast immer verwenden $host, da es der einzige ist, der garantiert etwas Sinnvolles hat, unabhängig davon, wie sich der Benutzer-Agent verhält, es sei denn, Sie benötigen speziell die Semantik einer der anderen Variablen.

Der Unterschied ist in der erklärt Nginx-Dokumentation:

  • $host enthält "in dieser Rangfolge: Hostname aus der Anforderungszeile oder Hostname aus dem Anforderungsheaderfeld" Host "oder den Servernamen, der einer Anfrage entspricht"
  • $http_host enthält den Inhalt des HTTP- "Host" -Header-Felds, wenn es in der Anfrage vorhanden war
  • $server_name enthält die server_name des virtuellen Hosts, der die Anfrage verarbeitet hat, wie sie in der nginx-Konfiguration definiert wurde. Wenn eine server enthält mehrere server_names, nur der erste wird in dieser Variable vorhanden sein.

Da es für Benutzeragenten zulässig ist, den Hostnamen in der Anforderungszeile und nicht in einem Host: -Header zu senden, obwohl dies selten geschieht, außer wenn eine Verbindung zu Proxies hergestellt wird, müssen Sie dies berücksichtigen.

Sie müssen auch den Fall berücksichtigen, in dem der Benutzeragent überhaupt keinen Hostnamen sendet, z. alte HTTP / 1.0-Anfragen und moderne schlecht geschriebene Software. Sie können dies tun, indem Sie sie an einen virtuellen Cach-All-Host umleiten, der nichts liefert. 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 der $host variable Konten für alle möglichen Dinge, die ein User-Agent bei der Erstellung einer HTTP-Anfrage ausführen kann.


43
2017-07-17 02:07



Auf der anderen Seite, die $server_name ist sicher wann Host: Feld von UA ​​kann beliebigen Inhalt enthalten. - Cthulhu
Ist $ http_host in $ hostname umbenannt? Ich kann eine solche Variable in Nginx doc nicht finden. $ Hostname ist der ähnlichste, den ich vermute. - darkbaby123
@ darkbaby123 Nein, es wurde nichts umbenannt. Sehen die Dokumentation. - Michael Hampton♦
Ah, jetzt verstehe ich, was http_ <name> Variable bedeutet. Vielen Dank! - darkbaby123


Ich möchte einen weiteren wichtigen Punkt hinzufügen, der in der angenommenen Antwort nicht erwähnt wird.

$host tun NICHT habe Portnummer, während $http_hostGeben Sie die Portnummer ein.

bearbeiten: nicht immer.

Ich habe einen Header "add_header Y-Blog-http_host" $ http_host "immer" eingerichtet;

Dann curl -I -L domain.com:80 (oder 443) und der Header zeigt überhaupt keine Portnummer an. Verifiziert mit nginx-extra 1.10.3. Ist es, weil es gemeinsame HTTP (s) -Ports oder Nginx-Konfiguration ist? Dieser Kommentar nur um Dinge zu sagen, nicht immer Benimm dich so wie du denkst.


0
2018-01-04 01:37