Certains serveurs Web, lorsqu'ils accèdent à l'aide de leur adresse IP, renvoient une erreur indiquant que l'accès direct à une adresse IP n'est pas autorisé.
Je me demande depuis quelque temps comment cela fonctionne. Je veux dire, le navigateur ne résout-il pas toujours l'adresse IP et s'y connecte-t-il? L '"accès direct aux adresses IP" ne fait-il pas que sauter le DNS? Comment le serveur distant sait-il même que vous avez ignoré le DNS?
Pour répondre à votre question de comment il sait , cela a à voir avec ce que votre navigateur envoie au serveur.
Vous avez raison de dire que le système le résout toujours en une adresse IP, mais le navigateur envoie l'URL à laquelle vous avez tenté d'accéder dans l'en-tête HTTP.
Voici un exemple d'en-tête que j'ai trouvé en ligne, modifié pour donner l'impression que vous utilisiez Firefox sous Windows et que vous avez entré Apple.com
dans la barre d'adresse:
GET / HTTP/1.1
Host: Apple.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Voici à quoi ressemblerait l'en-tête si vous utilisiez son adresse IP:
GET / HTTP/1.1
Host: 17.142.160.59
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Ces deux éléments seraient envoyés à la même adresse IP via un socket, mais le navigateur indique au serveur à quoi il a accédé.
Pourquoi? Parce que les serveurs Web avec la même adresse IP peuvent héberger plusieurs sites et donner des pages différentes pour chacun. Il ne peut pas distinguer qui veut quelle page par adresse IP car ils ont tous le même - mais il peut les distinguer par l'en-tête HTTP.
Avec le protocole HTTP 1.1 (l'ancienne version HTTP 1.0 était obsolète depuis un certain temps, il est donc peu probable qu'elle soit utilisée par une version récente d'un navigateur), l'en-tête Host
a été introduit. Pour HTTP 1.1, il s'agit d'une ligne d'en-tête obligatoire qui doit être émise par un navigateur . Le navigateur spécifie le nom de domaine dans cette ligne, par exemple. Host: example.com
. Le serveur Web sait donc à quel site Web le navigateur veut accéder à partir de cette ligne. Comme un serveur Web peut prendre en charge des dizaines de sites Web, cette ligne est importante pour déterminer le site Web sur lequel réside la page demandée. En supposant que le navigateur souhaite accéder à la page d'accueil d'un site sur example.com, il envoie la ligne suivante au serveur lorsqu'il se connecte au serveur:
GET / HTTP/1.1
Cette ligne spécifie que le navigateur souhaite obtenir le document racine, c'est-à-dire "/" pour le site Web. Si vous voulez accéder à /somedir/testpage.html
, GET /somedir/testpage.html
serait dans la ligne "get". La ligne sera suivie de la ligne ci-dessous:
Host: example.com
Ainsi, si le serveur Web prend en charge les sites Web exemple.com, someothersite.com, yetanothersite.org, etc., il sait qu'il doit renvoyer la page principale de example.com. S'il n'obtient pas cette ligne ou si aucun nom de domaine n'est répertorié dans la ligne Host
, il ne sait pas quelle page d'accueil du site Web doit être renvoyée. Donc, il peut retourner un message d'erreur ou renvoyer la page d'accueil pour un site "par défaut" pour le serveur.
Vous pouvez émettre les mêmes commandes que le navigateur qui utilise le protocole telnet , par exemple, telnet example.com 80
à partir d’une invite du shell Linux ou d’un Apple OS X Fenêtre Terminal , pour se connecter au port HTTP par défaut, port 80 - voir Test de l'accès à un site Web à l'aide de PuTTY pour les étapes à suivre avec PuTTY sur un système Windows.
Cela est dû à l'en-tête HTTP Host:
. Ceci est très utile pour héberger plusieurs sites sur la même adresse IP. Par exemple, http://www.k7dxs.net/ et http://www.philipgrimes.com/ sont tous deux sur la même adresse IP. Cependant, en raison de l'en-tête Host:
, ils peuvent afficher deux sites différents.
Pour HTTPS, comme @Toothbrush l’a souligné, ils utilisent l’indication du nom du serveur TLS car l’en-tête de l’hôte fait partie de la demande chiffrée et le serveur ne sait pas quel certificat offrir sans cela.
Expérience amusante: obtenez des données de sabotage pour Firefox (je n'ai pas réussi à trouver un équivalent pour Chrome) et commencez à altérer. Ouvrez http://slipstation.com/ et modifiez l'en-tête Host:
dans la demande pour qu'il soit http://www.zombo.com/ . Vous verrez un site Web éventuellement familier où tout est possible.
Le serveur Web peut être configuré pour accepter uniquement les connexions à un domaine ou à un sous-domaine particulier. Il pourrait héberger plusieurs domaines.
Ce que le serveur Web fait quand une adresse IP directe est utilisée est configurable. Dans le cas d'Apache, il ira par défaut au premier vhost nommé sur les sites activés, qui sont triés par ordre alphabétique.
C’est la partie la plus pertinente de la documentation Apache que j’ai trouvée, après une recherche rapide:
https://httpd.Apache.org/docs/current/vhosts/name-based.html