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.