Qual è la differenza tra le variabili Nginx $ host, $ http_host e $ server_name?


42

Qual è la differenza tra le tre variabili Nginx $host, $http_host, e $server_name?

Ho una regola di riscrittura in cui non sono sicuro quale dovrei usare:

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/;
        }

Sto cercando una risposta che non dica solo "usa la variabile ___ nella tua regola di riscrittura", ma spiega anche le differenze teoriche tra loro.


Mi sono reso conto in seguito che non avevo nemmeno bisogno di specificare $schemee $host... return 301 /forum/index.php?posts/$arg_p/;funziona bene.
Jeff Widman,

La maggior parte dei browser funzionerebbe con URL relativo nel reindirizzamento, ma lo standard ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) richiede l'URL assoluto Locationnell'intestazione.
Cthulhu,

Risposte:


54

Dovresti quasi sempre usarlo $host, poiché è l'unico garantito per avere qualcosa di sensato indipendentemente da come si comporta l'agente utente, a meno che tu non abbia specificamente bisogno della semantica di una delle altre variabili.

La differenza è spiegata nella documentazione di nginx :

  • $host contiene "in questo ordine di precedenza: nome host dalla riga della richiesta o nome host dal campo dell'intestazione della richiesta" Host "o nome del server corrispondente a una richiesta"
  • $http_host contiene il contenuto del campo di intestazione HTTP "Host", se era presente nella richiesta
  • $server_namecontiene l' server_namehost virtuale che ha elaborato la richiesta, come definito nella configurazione nginx. Se a servercontiene più server_names, in questa variabile sarà presente solo il primo.

Poiché è legale per gli user-agent inviare il nome host nella riga della richiesta anziché nell'intestazione Host: anche se raramente viene fatto tranne quando ci si connette ai proxy, è necessario tenere conto di ciò.

Devi anche tenere conto del caso in cui l'utente-agente non invii affatto un nome host, ad esempio antiche richieste HTTP / 1.0 e software moderno mal scritto. Potresti farlo deviandoli a un host virtuale universale che non serve nulla, se stai servendo più siti Web o se hai un solo sito Web sul tuo server potresti elaborare tutto attraverso un singolo host virtuale . In quest'ultimo caso devi tenere conto anche di questo.

Solo le $hostvariabili rappresentano tutte le possibili cose che un agente utente può fare quando si forma una richiesta HTTP.


2
D'altra parte, $server_nameè sicuro quando il Host:campo di UA può contenere contenuti arbitrari.
Cthulhu,

1
$ Http_host è stato rinominato in $ hostname? Non riesco a trovare tale variabile nel documento Nginx. $ hostname è il più simile immagino.
darkbaby123,

3
@ darkbaby123 No, non è stato rinominato in alcun modo. Vedere la documentazione .
Michael Hampton

1
Ah ora capisco cosa significa la variabile http_ <name>. Grazie!
darkbaby123

0

Vorrei aggiungere un altro punto importante non menzionato nella risposta accettata.

$hostdo non avere il numero di porta, mentre $http_hostcomprendono il numero di porta.

modifica : non sempre.

Ho impostato un'intestazione "add_header Y-blog-http_host" $ http_host "sempre;"

Quindi curl -I -L domain.com:80(o 443) e l'intestazione non mostra affatto un numero di porta. Verificato con nginx-extra 1.10.3. È perché si tratta delle comuni porte http o della configurazione nginx? Questo commento solo per dire che le cose non si comportano sempre nel modo in cui pensi.


0

Ho anche lottato con questo per un po '. È diventato chiaro quando ho capito che $ http_XXXXX si riferisce a tutte le variabili di intestazione dichiarate.

Quindi $ http_user_agent, $ http_referer sono "AGENTE UTENTE", "RIFERIMENTO" a cui si fa riferimento in minuscolo e carattere di sottolineatura. Questo mi ha spiegato da dove diavolo proveniva $ http_upgrade in molti esempi di configurazione di NGINX.

Leggi da https://stackoverflow.com/questions/15414810/whats-the-difference-of-host-and-http-host-in-nginx

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.