Comment les serveurs Web savent-ils si vous utilisez l'accès direct aux adresses IP?

Certains serveurs Web, lorsqu'ils sont accédés à l'aide de leur adresse IP, renvoient une erreur que l'accès direct à l'adresse IP n'est pas autorisé.

Je me demandais depuis un certain temps comment cela fonctionne. Je veux dire, le navigateur ne résout-il pas toujours l'adresse IP et ne le connecte-t-il pas? L'accès à l'adresse IP n'est-il pas simple? Sauf le DNS? Comment le serveur distant sait- il que vous avez ignoré le DNS?

Pour répondre à votre question sur la façon dont il sait , il a trait à ce que votre navigateur envoie le serveur.

Vous avez raison que le système le résout toujours à une adresse IP, mais le navigateur envoie l'URL que 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 que vous ayez utilisé Firefox sur Windows et que vous tapez 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 l'aspect de l'en-tête si vous avez utilisé 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 sur un socket, mais le navigateur indique au serveur ce qu'il a accédé.

Pourquoi? Parce que les serveurs Web avec la même adresse IP peuvent accueillir plusieurs sites et donner différentes pages pour chacun. Il ne peut pas distinguer qui veut quelle page par adresse IP parce qu'ils ont tous le même – mais il peut les distinguer par l'en-tête HTTP.

Avec le protocole HTTP 1.1 (la version antérieure de HTTP 1.0 est obsolète pendant un certain temps, il est peu probable qu'elle soit utilisée par une version récente d'un navigateur), l'en-tête d' host été introduit. Pour HTTP 1.1, c'est une ligne d'en-tête requise qui doit être émise par un navigateur . Le nom de domaine est inclus dans le navigateur dans cette ligne, par exemple Host: example.com . Ainsi, le serveur Web sait quel site Web le navigateur souhaite accéder à partir de cette ligne. Étant donné qu'un serveur Web peut soutenir des dizaines de sites Web, cette ligne est importante pour déterminer quel site Web 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 émet la ligne suivante vers le 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. Si vous vouliez 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 

Donc, si le serveur Web prend en charge les sites internet example.com, someothersite.com, yetanothersite.org, etc., il sait qu'il devrait retourner la page principale par exemple. Si elle n'atteint pas cette ligne ou n'a pas de nom de domaine dans la ligne Host , elle ne sait pas quelle page d'accueil doit être renvoyée. Il peut donc renvoyer 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 qu'un navigateur utilise en utilisant le protocole telnet , par exemple telnet example.com 80 partir d'une invite de shell Linux ou d'une fenêtre de terminal Apple OS X, pour vous connecter au port HTTP par défaut, port 80 – voir Test d'accès à un Site utilisant PuTTY pour les étapes à suivre avec PuTTY sur un système Windows.

Ceci est dû à l'en-tête Host: HTTP. Ceci est très utile pour héberger plusieurs sites sur la même adresse IP. Par exemple, http://www.chaoswebs.net/ et http://www.glowingsquid.com/ sont tous deux sur la même adresse IP. Toutefois, en raison de l' Host: tête, ils peuvent afficher deux sites différents.

Pour HTTPS, comme l'ont souligné @Toothbrush, ils utilisent l'indication de nom de serveur TLS car l'en-tête d'hôte fait partie de la demande cryptée et le serveur ne sait pas quel cert offrir sans cela.

Expérience amusante: Obtenez des informations sur Tamper pour Firefox (je n'ai pas pu trouver un équivalent pour Chrome) et commencer à falsifier. Ouvrez http://slipstation.com/ et modifiez l'en Host: tête Host: dans la requête pour être 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 sous-domaine particulier. Il pourrait accueillir plusieurs domaines.

Ce que le serveur Web fait lorsqu'une adresse IP directe est utilisée est configurable. Dans le cas d'Apache, il va par défaut accéder à la première propriété de la liste des sites activés, qui sont classés par ordre alphabétique.

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