Host
Utilisation
Toute requête HTTP/1.1 comporte un en-tête Host. Cet en-tête rend possible l’hébergement virtuel, où un seul serveur doté d’une unique adresse IP héberge plusieurs domaines. Sans Host, le serveur n’a aucun moyen de déterminer quel domaine le client cherchait à atteindre.
La valeur contient le nom d’hôte demandé et, facultativement, un numéro de port séparé par un deux-points. Lorsqu’aucun port n’est indiqué, le port par défaut du schéma s’applique : le port 80 pour HTTP et le port 443 pour HTTPS.
Un serveur qui reçoit une requête HTTP/1.1 sans en-tête Host répond 400 Bad Request. La même réponse s’applique lorsqu’une requête contient plus d’un en-tête Host, car l’ambiguïté empêche le serveur de sélectionner le bon hôte virtuel.
En HTTP/2 et HTTP/3, le champ de pseudo-en-tête :authority remplace Host. Les clients qui envoient des requêtes HTTP/2 ou HTTP/3 placent l’information d’hôte dans :authority à la place. Lorsqu’une passerelle convertit une requête HTTP/2 en HTTP/1.1, elle génère l’en-tête Host à partir de la valeur de :authority.
L’en-tête Host diffère de l’en-tête Origin. Host identifie le serveur cible de chaque requête. Origin identifie la source d’une requête cross-origin et n’apparaît que dans des contextes précis, comme les requêtes de préflight CORS et les soumissions de formulaires.
host
Le nom de domaine ou l’adresse IP du serveur cible.
port
Un numéro de port TCP facultatif. Lorsqu’il est omis, le port par défaut du schéma de la requête est supposé (80 pour HTTP, 443 pour HTTPS).
Host: <host>:<port>
Exemple
Une requête HTTPS standard vers un serveur web omet le port, car 443 est la valeur par défaut pour HTTPS.
GET /articles/http-headers HTTP/1.1
Host: example.re
Lorsqu’un serveur écoute sur un port non standard, le numéro de port est indiqué après le nom d’hôte.
GET /api/status HTTP/1.1
Host: api.example.re:8443
Une requête vers une adresse IP comporte l’adresse directement. Cette forme est courante dans les environnements de développement et les services internes.
GET /health HTTP/1.1
Host: 192.168.1.100:3000
Sécurité
L’injection d’en-tête Host survient lorsque des applications utilisent la valeur de Host pour générer des URL (liens de réinitialisation de mot de passe, URL canoniques, redirections) sans la valider au préalable. Un attaquant envoie une requête avec une valeur Host falsifiée, amenant l’application à produire des liens pointant vers un domaine qu’il contrôle.
Validez l’en-tête Host par rapport à une liste blanche de valeurs attendues. Dans nginx, définissez server_name avec un bloc server fourre-tout par défaut renvoyant 444. Dans Django, renseignez ALLOWED_HOSTS avec la liste des domaines autorisés. Dans Rails, configurez host_authorization dans l’environnement applicatif. Les navigateurs traitent Host comme un en-tête de requête interdit, empêchant le JavaScript côté client d’en modifier la valeur, mais les requêtes de serveur à serveur et les outils comme curl ne subissent aucune restriction de ce type.