Qu'est-ce que l'en-tête d'hôte http?

122

Étant donné que la connexion TCP est déjà établie lorsque la requête HTTP est envoyée, l'adresse IP et le port sont implicitement connus - une connexion TCP est un port IP +. Alors, pourquoi avons-nous besoin de l'en- Hosttête? Est-ce uniquement nécessaire dans le cas où plusieurs hôtes sont mappés à l'adresse IP impliquée dans la connexion TCP?

Vladimir Lénine
la source

Réponses:

143

L'en- hosttête indique au serveur Web l' hôte virtuel à utiliser (s'il est configuré). Vous pouvez même avoir le même hôte virtuel en utilisant plusieurs alias (= domaines et wildcard-domaines). Dans ce cas, vous avez toujours la possibilité de lire cet en-tête manuellement dans votre application Web si vous souhaitez fournir un comportement différent en fonction des différents domaines adressés. Ceci est possible car dans votre serveur Web, vous pouvez (et si je ne me trompe pas, vous devez) configurer un hôte virtuel comme hôte par défaut. Ce vhost par défaut est utilisé chaque fois que l'en- hosttête ne correspond à aucun des hôtes virtuels configurés.

Cela signifie: vous avez raison, bien que dire "plusieurs hôtes" puisse être quelque peu trompeur: l'hôte (la machine adressée) est le même, ce qui est vraiment résolu en adresse IP, ce sont différents noms de domaine (y compris les sous-domaines) qui sont également référencés en tant que noms d' hôte (mais pas d'hôtes!).

Bien que ne faisant pas partie de la question, un fait amusant: cette spécification a conduit à des problèmes avec SSL dans les premiers jours car le serveur Web doit fournir le certificat qui correspond au domaine adressé par le client. Cependant, pour savoir quel certificat utiliser, le serveur Web doit avoir connu à l'avance le nom d'hôte adressé. Mais comme le client envoie ces informations uniquement sur le canal crypté (ce qui signifie: une fois que le certificat a déjà été envoyé), le serveur a dû supposer que vous naviguiez sur l'hôte par défaut. Cela signifiait un domaine sécurisé par SSL par adresse IP / combinaison de ports.

Cela a été surmonté avec l' indication du nom du serveur ; cependant, cela brise à nouveau une certaine confidentialité, car le nom du serveur est à nouveau transféré en texte brut, de sorte que chaque homme du milieu verra à quel nom d' hôte vous essayez de vous connecter.

Bien que le serveur Web connaisse le nom d'hôte à partir de l'indication du nom du serveur, l'en- hosttête n'est pas obsolète, car les informations d'indication du nom du serveur ne sont utilisées que dans l'établissement de liaison TLS. Avec une connexion non sécurisée, il n'y a aucune indication du nom du serveur, donc l'en- hosttête est toujours valide (et nécessaire).

Autre fait amusant: la plupart des serveurs Web (sinon tous) rejettent votre requête http si elle ne contient pas exactement un en- hosttête, même si elle pourrait être omise car il n'y a que le vhost par défaut configuré. Cela signifie que les informations minimales requises dans une requête http- (get-) sont la première ligne contenant METHOD RESOURCEet PROTOCOL VERSIONet au moins l'en- hosttête, comme ceci:

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

Dans la documentation MDN sur l'en-tête d'hôte, ils l'expriment comme suit:

Un champ d'en-tête Host doit être envoyé dans tous les messages de requête HTTP / 1.1. Un code d'état 400 (Bad Request) sera envoyé à tout message de requête HTTP / 1.1 qui n'a pas de champ d'en-tête Host ou en contient plusieurs.

Comme mentionné par Darrel Miller, les spécifications complètes peuvent être trouvées dans la RFC7230 .

Psi
la source
bonne réponse. Vous avez écrit "C'est possible parce que dans votre serveur Web, vous pouvez (et si je ne me trompe pas, vous devez) configurer un hôte virtuel comme hôte par défaut. Cet hôte virtuel par défaut est utilisé chaque fois que l'en-tête d'hôte ne correspond à aucun des serveurs virtuels configurés. hôtes. " Je voulais vérifier dans RFC7230 mais je n'ai pas trouvé vhostseulement 3 occurrences proches de virtual hostavec un sens pas proche de votre phrase et 12 pour defaultprincipalement sur le port,
Alexei Martianov
à propos de l'hôte uniquement que: "Sinon, si un champ d'en-tête Host est fourni avec une valeur de champ non vide, le composant d'autorité est le même que la valeur de champ Host." - pas à mon humble avis le même. Pouvez-vous me faire remarquer dans RFC à ce sujet?
Alexei Martianov
côté pratique: à un serveur, j'envoie POST avec en-tête host = nom de domaine et j'en reçois 200 (ok), j'envoie un en-tête d'hôte modifié et j'obtiens 404 (non trouvé). Cela pourrait-il signifier que le serveur n'est pas correctement (entièrement by the book) configuré?
Alexei Martianov
car le commentaire ne peut pas être modifié: la citation dans le 2ème était un defaultmot proche trouvé par recherche,Otherwise, the authority component is assigned the default name configured for the server
Alexei Martianov
étrange. les 3 occurrences de virtual hosttrouvées par ma recherche dans tools.ietf.org/html/rfc7230 sont dans Appendix A. HTTP Version History. semble que votre recherche en ait trouvé une autre.
Alexei Martianov
30

Je recommanderais toujours d'aller à la source faisant autorité pour essayer de comprendre la signification et le but des en-têtes HTTP.

Le champ d'en-tête "Host" dans une demande fournit les
informations d' hôte et de port de l'URI cible, permettant au serveur d'origine de faire la
distinction entre les ressources tout en traitant les demandes de plusieurs
noms d'hôte sur une seule adresse IP.

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

Darrel Miller
la source