web-dev-qa-db-fra.com

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

Étant donné que la connexion TCP est déjà établie lors de l'envoi de la demande HTTP, l'adresse IP et le port sont connus de manière implicite - une connexion TCP est un IP + Port. Alors, pourquoi avons-nous besoin de l'en-tête Host? Est-ce nécessaire uniquement dans le cas où plusieurs hôtes sont mappés à l'adresse IP implicite dans la connexion TCP?

58
VladimirLenin

L'en-tête Host indique au serveur Web quel hôte virtuel utiliser (si configuré). Vous pouvez même avoir le même hôte virtuel en utilisant plusieurs aliases (= domain et wildcard-domain). 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. Cela est possible car sur votre serveur Web, vous pouvez (et si je ne me trompe pas, vous devez le faire) configurer one vhost pour qu’il soit l’hôte par défaut. Ce vhost 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 comprenez bien, même si dire "plusieurs hôtes" peut être quelque peu trompeur: l'hôte (la machine adressée) est identique, ce qui est résolu en adresse IP est différent noms de domaine (y compris les sous-domaines) qui sont également appelés noms d'hôtes (mais pas les hôtes!).

Bien que cela ne fasse pas partie de la question, c'est un fait amusant: cette spécification a provoqué des problèmes avec SSL au tout début, car le serveur Web devait fournir le certificat correspondant au domaine que le client avait adressé. Toutefois, pour savoir quel certificat utiliser, le serveur Web doit connaître le nom d’hôte adressé à l’avance. Mais comme le client envoie ces informations uniquement via le canal crypté (ce qui signifie: après l'envoi du certificat), le serveur devait supposer que vous avez consulté l'hôte par défaut. Cela signifiait un domaine sécurisé par SSL/combinaison adresse/port.

Ceci a été résolu avec Indication du nom du serveur ; cependant, cela nuit encore à la confidentialité, car le nom du serveur est maintenant transféré en texte brut, de sorte que chaque homme au milieu voit le nom d'hôte auquel 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-tête Host n’est pas obsolète, car les informations d’indication du nom du serveur ne sont utilisées que dans le dialogue TLS. Avec une connexion non sécurisée, il n'y a pas d'indication de nom de serveur, donc l'en-tête Host est toujours valide (et nécessaire).

Autre fait intéressant: la plupart des serveurs Web (si pas tous) rejettent votre demande http si elle ne contient pas exactement un en-tête Host, même s'il est possible de l'omettre car il n'y a que le vhost par défaut configuré. Cela signifie que les informations minimales requises dans une demande http- (get-) sont la première ligne contenant METHODRESOURCE et PROTOCOL VERSION et au moins l'en-tête Host-, comme ceci:

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

Vous voudrez peut-être lire la Documentation MDN sur l’en-tête-hôte pour plus d’informations, qui dit

Un champ d'en-tête d'hôte doit être envoyé dans tous les messages de requête HTTP/1.1. UNE 400 codes d'état (Bad Request) seront envoyés à toute requête HTTP/1.1 message qui ne contient pas de champ d'en-tête d'hôte ou en contient plusieurs.

Comme mentionné par Darrel Miller, les spécifications complètes se trouvent dans RFC7230

78
Psi

Je recommanderais toujours de consulter la source faisant autorité lorsque vous essayez de comprendre le sens 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.
informations de l'URI cible, permettant au serveur d'origine de
distinguer les ressources tout en répondant aux demandes de plusieurs
Noms d'hôte sur une seule adresse IP.

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

10
Darrel Miller

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 Microsoft l'appelle, un serveur d'applications. Par exemple, le nom d'en-tête de l'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 d'en-tête de l'hôte que vous avez spécifié dans le champ 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 la demande, le domaine Web racine fait office de serveur Web par défaut.

0
Kiara Lima