64

Некоторые веб-серверы при обращении с использованием своего IP-адреса выдают ошибку, что прямой доступ по IP-адресу не разрешен.

Некоторое время я задавался вопросом, как это работает. Я имею в виду, браузер не всегда разрешает IP-адрес и подключается к нему? Разве «Прямой доступ по IP-адресу» не пропускает DNS? Как удаленный сервер узнает, что вы пропустили DNS?

4 ответа4

91

Чтобы ответить на ваш вопрос о том, как он знает, это связано с тем, что ваш браузер отправляет на сервер.

Вы правы, что система всегда разрешает его в IP-адрес, но браузер отправляет URL-адрес, к которому вы пытались получить доступ, в заголовке HTTP.

Вот пример заголовка, который я нашел в сети, модифицированный, чтобы выглядело так, как будто вы использовали Firefox в Windows и набрали apple.com в адресную строку:

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

Вот как будет выглядеть заголовок, если вы используете его 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

Оба они будут отправлены на один и тот же IP-адрес через сокет, но браузер сообщает серверу, к чему он обращался.

Зачем? Потому что веб-серверы с одинаковым IP-адресом могут размещать несколько сайтов и давать разные страницы для каждого. Он не может различить, кому нужна какая страница по IP-адресу, потому что все они имеют один и тот же, но он может различить их по заголовку HTTP.

21

С протоколом HTTP 1.1 (предыдущая версия HTTP 1.0 уже давно устарела, поэтому вряд ли будет использоваться какой-либо последней версией браузера), был введен заголовок host . Для HTTP 1.1 это обязательная строка заголовка, которая должна быть выдана браузером . Доменное имя включено браузером в эту строку, например, Host: example.com . Таким образом, веб-сервер знает, к какому веб-сайту браузер хочет получить доступ с этой линии. Поскольку веб-сервер может поддерживать десятки веб-сайтов, эта строка важна для него, чтобы определить, на каком веб-сайте находится запрошенная страница. Предположим, что браузер хочет получить доступ к домашней странице сайта на example.com, при подключении к серверу он выдает следующую строку:

GET / HTTP/1.1

В этой строке указывается, что браузер желает получить корневой документ, т. Е. «/» Для веб-сайта. Если вы хотите получить доступ к /somedir/testpage.html , GET /somedir/testpage.html будет в строке "get". За строкой будет следовать строка ниже:

Host: example.com

Поэтому, если веб-сервер поддерживает сайты example.com, someothersite.com, Yetanothersite.org и т.д., Он знает, что должен вернуть главную страницу для example.com. Если он не получает эту строку или не имеет доменного имени, указанного в строке « Host , он не знает, какую домашнюю страницу веб-сайта следует вернуть. Таким образом, он может вернуть сообщение об ошибке или вернуть домашнюю страницу сайта по умолчанию для сервера.

Вы можете выполнить те же команды, которые выдает браузер, используя протокол telnet , например, telnet example.com 80 из командной строки Linux или окна терминала Apple OS X, чтобы подключиться к стандартному HTTP-порту, порт 80 - см. Проверка доступа к веб-сайт, использующий PuTTY, чтобы узнать, как сделать это с PuTTY в системе Windows.

6

Это связано с заголовком Host: HTTP. Это очень полезно для размещения нескольких сайтов на одном IP-адресе. Например, http://www.k7dxs.net/ и http://www.philipgrimes.com/ находятся на одном IP-адресе. Однако из-за заголовка Host: они могут показывать два разных сайта.

Для HTTPS, как указал @Toothbrush, они используют указание имени сервера TLS, поскольку заголовок хоста является частью зашифрованного запроса, и сервер не знает, какой сертификат предложить без этого.

Забавный эксперимент: получите данные взлома для Firefox (я не смог найти аналога для Chrome) и начните вмешиваться. Откройте http://slipstation.com/ и отредактируйте заголовок Host: в запросе на http://www.zombo.com/. Вы увидите, возможно, знакомый сайт, где все возможно.

5

Веб-сервер может быть настроен на прием только соединений с конкретным доменом или поддоменом. Это может быть хостинг нескольких доменов.

То, что делает веб-сервер при использовании прямого IP-адреса, настраивается. В случае Apache он по умолчанию перейдет к первому имени vhost из включенных сайтов, которые отсортированы в алфавитном порядке.

Это самая важная часть документации Apache, которую я нашел после быстрого поиска:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .