Fondamentalement: le navigateur inclut le nom de domaine dans la requête HTTP afin que le serveur Web connaisse le domaine demandé et puisse répondre en conséquence.
Requêtes HTTP
Voici comment se passe votre requête HTTP typique:
L'utilisateur fournit une URL, sous la forme http://host:port/path
.
Le navigateur extrait la partie hôte (domaine) de l'URL et la traduit si nécessaire en adresse IP, dans le cadre d'un processus appelé résolution de nom . Cette traduction peut se faire via DNS, mais cela n’est pas obligatoire (par exemple, le hosts
fichier local sur les systèmes d’exploitation courants contourne DNS).
Le navigateur ouvre une connexion TCP sur le port spécifié ou sur le port 80 par défaut pour cette adresse IP.
Le navigateur envoie une requête HTTP. Pour HTTP / 1.1, cela ressemble à ceci:
GET /path HTTP/1.1
Host: example.com
(L'en- Host
tête est standard et requis dans HTTP / 1.1. Il n'a pas été spécifié dans les spécifications HTTP / 1.0, mais certains serveurs le prennent en charge de toute façon.)
À partir de là, le serveur Web dispose de plusieurs informations qu'il peut utiliser pour décider de la réponse. Notez qu'il est possible qu'un seul serveur Web soit lié à plusieurs adresses IP.
- L'adresse IP demandée, à partir du socket TCP
- L'adresse IP du client est également disponible, mais elle est rarement utilisée - parfois pour le blocage / filtrage
- Le port demandé, depuis le socket TCP
- Le nom d'hôte demandé, tel que spécifié dans l'en-
Host
tête par le navigateur dans la requête HTTP.
- Le chemin demandé
- Tout autre en-tête (cookies, etc.)
Comme vous semblez l'avoir remarqué, la configuration d'hébergement mutualisé la plus commune de nos jours met plusieurs sites Web sous une seule adresse IP: combinaison de port, ne laissant que la Host
différence entre les sites Web.
Ceci s'appelle un hôte virtuel basé sur un nom dans Apache-land, tandis que Nginx les appelle noms de serveur dans des blocs de serveur et qu'IIS préfère Virtual Server .
Qu'en est-il de HTTPS?
HTTPS est un peu différent. Tout est identique jusqu'à l'établissement de la connexion TCP, mais après cela, un tunnel TLS crypté doit être établi. L'objectif est de ne pas divulguer d'informations sur la demande.
Afin de vérifier que le serveur possède réellement ce domaine, le serveur doit envoyer un certificat signé par un tiers de confiance. Le navigateur comparera ensuite ce certificat avec le domaine demandé.
Cela pose un problème. Comment le serveur sait-il quel certificat d'hôte (site Web) envoyer, s'il doit le faire avant la réception de la demande HTTP?
Traditionnellement, cela était résolu en ayant une adresse IP dédiée (ou un port) pour chaque site Web nécessitant HTTPS. Évidemment, cela devient problématique lorsque nous commençons à manquer d'adresses IPv4.
Entrez SNI (Indication du nom du serveur). Le navigateur transmet maintenant le nom d'hôte lors des négociations TLS. Le serveur dispose donc de ces informations suffisamment tôt pour envoyer le certificat correct. Du côté du serveur, la configuration est très similaire à la configuration des hôtes virtuels HTTP.
L'inconvénient est que le nom d'hôte est maintenant passé en texte brut avant le cryptage et constitue essentiellement une fuite d'informations. Cela est généralement considéré comme un compromis acceptable, étant donné que le nom d’hôte est normalement exposé dans une requête DNS.
Et si vous demandez un site par adresse IP uniquement?
Ce que le serveur fait lorsqu'il ne sait pas quel hôte spécifique vous avez demandé dépend de la mise en œuvre et de la configuration du serveur. En règle générale, un site "par défaut", "catchall" ou "fallback" est spécifié et fournira des réponses à toutes les demandes ne spécifiant pas explicitement un hôte.
Ce site par défaut peut être son propre site indépendant (affichant souvent un message d'erreur) ou l'un des autres sites du serveur, en fonction des préférences de l'administrateur du serveur.
Host:
tête. En cas d'hébergement partagé, le serveur Web peut être configuré par le fournisseur pour le gérer de différentes manières (par exemple, avoir une valeur par défaut, rediriger le fournisseur, etc.).