65 votes

Comment les serveurs web savent-ils si vous utilisez l'accès direct par adresse IP ?

Certains serveurs web, lorsqu'on y accède en utilisant leur adresse IP, renvoient une erreur indiquant que l'accès direct à l'adresse IP n'est pas autorisé.

Je me demande depuis un certain temps comment cela fonctionne. Je veux dire, le navigateur ne résout-il pas toujours l'adresse IP et ne s'y connecte-t-il pas ? L'"accès direct à l'adresse IP" ne consiste-t-il pas simplement à sauter le DNS ? Comment le serveur distant peut-il même connaître vous avez sauté le DNS ?

91voto

iAdjunct Points 1590

Pour répondre à votre question comment il sait il s'agit de ce que votre navigateur envoie au serveur.

Vous avez raison de dire que le système la 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 avez utilisé Firefox sous Windows et que vous avez tapé 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

Les deux seraient envoyés à la même adresse IP via un socket, mais le navigateur indique au serveur ce à quoi il a accédé.

Pourquoi ? Parce que les serveurs web ayant la même adresse IP peuvent héberger plusieurs sites et donner des pages différentes pour chacun d'eux. Il ne peut pas distinguer qui veut quelle page par l'adresse IP car ils ont tous la même - mais il peut les distinguer par l'en-tête HTTP.

21voto

moonpoint Points 4880

Avec le protocole HTTP 1.1 (la version antérieure HTTP 1.0 est obsolète depuis un certain temps, et il est donc peu probable qu'elle soit utilisée par une version récente d'un navigateur), la balise host a été introduit. Pour HTTP 1.1 qui est une ligne d'en-tête obligatoire qui doit être émise par un navigateur . Le nom de domaine est inclus par le navigateur dans cette ligne, par exemple Host: example.com . Ainsi, le serveur web sait à 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 lui permettre de déterminer sur quel site Web se trouve la page demandée. Supposons que le navigateur veuille accéder à la page d'accueil d'un site sur exemple.com, il envoie la ligne suivante au serveur lorsqu'il se connecte au serveur :

GET / HTTP/1.1

Cette ligne précise que le navigateur souhaite obtenir le document racine, c'est-à-dire "/" pour le site web. Si vous vouliez accéder à /somedir/testpage.html , GET /somedir/testpage.html serait dans la ligne "get". Cette ligne sera suivie de la ligne ci-dessous :

Host: example.com

Ainsi, si le serveur web prend en charge les sites web example.com, someothersite.com, yetanothersite.org, etc., il sait qu'il doit renvoyer la page principale de example.com. S'il ne reçoit pas cette ligne, ou si le nom de domaine n'est pas répertorié dans le champ Host il ne sait pas quelle page d'accueil du site doit être renvoyée. Il peut donc renvoyer un message d'erreur ou la page d'accueil d'un site "par défaut" du serveur.

Vous pouvez émettre les mêmes commandes qu'un navigateur à l'aide de la commande telnet protocole, par exemple, telnet example.com 80 à partir d'un Linux Shell ou un Apple OS X Terminal pour se connecter au port HTTP par défaut, le port 80 - voir Tester l'accès à un site web en utilisant PuTTY pour savoir comment procéder avec PuTTY sur un système Windows.

6voto

Dessa Simpson Points 1553

Cela est dû à la Host: En-tête HTTP. Cette fonction est très utile pour héberger plusieurs sites sur la même adresse IP. Par exemple, http://www.k7dxs.net/ y http://www.philipgrimes.com/ sont tous deux sur la même adresse IP. Cependant, en raison de la Host: l'en-tête, ils peuvent montrer deux sites différents.

Pour HTTPS, comme l'a souligné @Toothbrush, ils utilisent TLS Server Name Indication parce que l'en-tête Host fait partie de la requête chiffrée et que le serveur ne sait pas quel certificat offrir sans cela.

Une expérience amusante : Obtenez Tamper Data pour Firefox (je n'ai pas pu trouver d'équivalent pour Chrome) et commencez à trafiquer. Ouvrez http://slipstation.com/ et modifiez le Host: dans la demande pour être http://www.zombo.com/ . Vous verrez un site Web peut-être familier où tout est possible.

5voto

paradroid Points 22121

Le serveur web peut être configuré pour n'accepter que les connexions vers un domaine ou un sous-domaine particulier. Il peut héberger plusieurs domaines.

Ce que fait le serveur web lorsqu'une adresse IP directe est utilisée est configurable. Dans le cas d'Apache, il ira par défaut vers le premier serveur virtuel nommé parmi les sites activés, qui sont classés par ordre alphanumérique.

C'est la partie la plus pertinente de la documentation d'Apache que j'ai trouvée, après une recherche rapide :

https://httpd.apache.org/docs/current/vhosts/name-based.html

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X