Cos'è l'intestazione host http?


121

Dato che la connessione TCP è già stabilita quando viene inviata la richiesta HTTP, l'indirizzo IP e la porta sono implicitamente noti: una connessione TCP è una porta IP +. Allora, perché abbiamo bisogno Hostdell'intestazione? È necessario solo nel caso in cui siano presenti più host associati all'indirizzo IP implicito nella connessione TCP?

Risposte:


142

L' hostintestazione indica al server web quale host virtuale utilizzare (se configurato). Puoi persino avere lo stesso host virtuale utilizzando diversi alias (= domini e domini con caratteri jolly). In questo caso, hai ancora la possibilità di leggere quell'intestazione manualmente nella tua app web se desideri fornire un comportamento diverso in base a diversi domini indirizzati. Questo è possibile perché nel tuo server web puoi (e se non sbaglio devi) impostare un vhost come host predefinito. Questo vhost predefinito viene utilizzato ogni volta che l' hostintestazione non corrisponde a nessuno degli host virtuali configurati.

Ciò significa: hai capito bene, anche se dire "più host" può essere in qualche modo fuorviante: l'host (la macchina indirizzata) è lo stesso, ciò che viene realmente risolto nell'indirizzo IP sono nomi di dominio diversi (inclusi i sottodomini) che vengono anche indicati come hostname (ma non host!).

Anche se non fa parte della domanda, un fatto divertente: questa specifica ha portato a problemi con SSL nei primi giorni perché il server Web deve fornire il certificato che corrisponde al dominio a cui il client si è rivolto. Tuttavia, per sapere quale certificato utilizzare, il server web avrebbe dovuto conoscere in anticipo il nome host indirizzato. Ma poiché il client invia queste informazioni solo sul canale crittografato (il che significa: dopo che il certificato è già stato inviato), il server ha dovuto presumere che tu abbia esplorato l'host predefinito. Ciò significava un dominio protetto da SSL per combinazione indirizzo IP / porta.

Questo problema è stato risolto con l' indicazione del nome del server ; tuttavia, ciò infrange di nuovo un po 'di privacy, poiché il nome del server viene ora trasferito di nuovo in testo normale, quindi ogni man-in-the-middle vedrebbe a quale hostname stai tentando di connetterti.

Sebbene il server web riconoscerebbe il nome host dall'indicazione del nome del server, l' hostintestazione non è obsoleta, poiché le informazioni sull'indicazione del nome del server vengono utilizzate solo all'interno dell'handshake TLS. Con una connessione non protetta, non è presente alcuna indicazione del nome del server, quindi l' hostintestazione è ancora valida (e necessaria).

Un altro fatto divertente: la maggior parte dei server web (se non tutti) rifiuta la tua richiesta http se non contiene esattamente hostun'intestazione, anche se potrebbe essere omessa perché è configurato solo il vhost predefinito. Ciò significa che le informazioni minime richieste in una richiesta http- (get-) è la prima riga contenente METHOD RESOURCEe PROTOCOL VERSIONe almeno l' hostintestazione, in questo modo:

GET /someresource.html HTTP/1.1
Host: www.example.com

Nella documentazione MDN sull'intestazione host in realtà lo esprimono in questo modo:

Un campo di intestazione host deve essere inviato in tutti i messaggi di richiesta HTTP / 1.1. Un codice di stato 400 (richiesta non valida) verrà inviato a qualsiasi messaggio di richiesta HTTP / 1.1 privo di un campo di intestazione host o che ne contenga più di uno.

Come accennato da Darrel Miller, le specifiche complete possono essere trovate in RFC7230 .


buona risposta. Hai scritto "Questo è possibile perché nel tuo server web puoi (e se non sbaglio devi) impostare un vhost come host predefinito. Questo vhost predefinito viene utilizzato ogni volta che l'intestazione dell'host non corrisponde a nessuno dei virtuali configurati padroni di casa." Volevo controllare RFC7230 ma non ho trovato vhostsolo 3 occorrenze ravvicinate virtual hostcon un significato non vicino alla tua frase e 12 per defaultlo più sulla porta,
Alexei Martianov

solo riguardo all'host che: "In caso contrario, se un campo di intestazione Host viene fornito con un valore di campo non vuoto, il componente di autorità è lo stesso del valore di campo Host." - non IMHO lo stesso. Puoi indicarmi di indicare in RFC su questo?
Alexei Martianov

lato pratico: ad alcuni server invio POST con header host = nome dominio e ottengo 200 (ok), invio intestazione host modificata e ricevo 404 (non trovato). Potrebbe significare che il server non è by the bookconfigurato correttamente (completamente )?
Alexei Martianov

poiché il commento non può essere modificato: la citazione nel 2 ° era vicino alla defaultparola trovata dalla ricerca,Otherwise, the authority component is assigned the default name configured for the server
Alexei Martianov

strano. tutte e 3 le occorrenze di virtual hosttrovato dalla mia ricerca in tools.ietf.org/html/rfc7230 sono in Appendix A. HTTP Version History. sembra che la tua ricerca ne abbia trovati altri.
Alexei Martianov

30

Consiglierei sempre di andare alla fonte autorevole quando provo a capire il significato e lo scopo delle intestazioni HTTP.

Il campo di intestazione "Host" in una richiesta fornisce le informazioni sull'host e sulla porta
dall'URI di destinazione, consentendo al server di origine di
distinguere tra le risorse mentre soddisfa le richieste di più
nomi host su un singolo indirizzo IP.

https://tools.ietf.org/html/rfc7230#section-5.4

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.