158 votes

Qu'est-ce que l'en-tête HTTP "Host"?

É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 connus implicitement - une connexion TCP est une IP + Port.

Alors, pourquoi avons-nous besoin de l'en-tête Host ? Est-ce seulement nécessaire dans le cas où plusieurs hôtes sont associés à l'adresse IP implicite de la connexion TCP ?

179voto

Psi Points 4286

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

Cela signifie: Vous l'avez compris, 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 réellement résolu à l'adresse IP sont différents noms de domaines (y compris les sous-domaines) qui sont également désignés par des hôtes (mais pas des hôtes!).


Bien que cela ne fasse pas partie de la question, un fait amusant: Cette spécification a entraîné des problèmes avec SSL dans les premières années car le serveur Web doit fournir le certificat correspondant au domaine adressé par le client. Cependant, pour savoir quel certificat utiliser, le serveur Web aurait dû connaître le nom d'hôte adressé à l'avance. Mais comme le client envoie cette information uniquement via le canal crypté (c'est-à-dire: après 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 seul domaine sécurisé par SSL par adresse IP / combinaison de port.

Cela a été résolu avec Server Name Indication; cependant, cela rompt à nouveau une certaine confidentialité, car le nom du serveur est maintenant transféré en clair, de sorte que tout homme du milieu verrait quel nom d'hôte vous essayez de connecter.

Bien que le serveur Web connaîtrait le nom d'hôte à partir de Server Name Indication, l'en-tête Host n'est pas obsolète, car les informations de Server Name Indication ne sont utilisées que dans la poignée de main TLS. Avec une connexion non sécurisée, il n'y a pas de Server Name Indication du tout, donc l'en-tête Host reste valide (et nécessaire).

Un autre fait amusant: La plupart des serveurs Web (si ce n'est tous) rejettent votre demande HTTP si elle ne contient pas exactement un en-tête Host, même s'il pourrait être omis car il n'y a que l'hôte virtuel par défaut configuré. Cela signifie que les informations minimales requises dans une demande http-(get-) sont la première ligne contenant METHODE RESSOURCE et VERSION DE PROTOCOLE et au moins l'en-tête Host, comme ceci:

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

Dans la documentation MDN sur l'en-tête "Host", ils le formulent en fait ainsi:

Un champ d'en-tête Host doit être envoyé dans tous les messages de demande HTTP/1.1. Un Le code d'état 400 (Requête incorrecte) sera renvoyé à tout HTTP/1.1 demander messages qui manquent d'un champ d'en-tête Host ou en contiennent plusieurs.

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

45voto

Darrel Miller Points 56797

Je recommanderais toujours de consulter la source autoritaire lorsqu'on essaie de comprendre la signification et le but des en-têtes HTTP.

Le champ d'en-tête "Host" dans une requête fournit l'hôte et le port
des informations sur l'URI cible, permettant au serveur d'origine de
distinguer 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

0voto

Kiara Lima Points 9

HTTP 1.1, un en-tête d'hôte est une troisième information que vous pouvez utiliser en plus de l'adresse IP et du numéro de port pour identifier de manière unique un domaine Web ou, comme l'appelle Microsoft, un serveur d'application. Par exemple, le nom de l'en-tête d'hôte pour l'URL www.example.com est www.example.com. Un navigateur HTML 3.0 ou ultérieur prend en charge HTTP 1.1. Le navigateur inclut le nom de l'en-tête d'hôte que vous avez spécifié dans le champ d'emplacement de l'en-tête de demande que le navigateur envoie au serveur. Si vous ne spécifiez pas de nom d'en-tête d'hôte dans l'en-tête de demande, le domaine Web racine agit comme le serveur Web par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X