Что такое HTTP-заголовок хоста?

Учитывая, что TCP-соединение уже установлено при отправке HTTP-запроса, IP-адрес и порт неявно известны - TCP-соединение является портом IP +. Итак, кому мы нужны Host заголовок? Это необходимо только в том случае, если несколько хостов сопоставлены с IP-адресом, подразумеваемым в соединении TCP?

2 ответа

Решение

host-Header сообщает веб-серверу, какой виртуальный хост использовать (если он настроен). Вы даже можете иметь один и тот же виртуальный хост, используя несколько псевдонимов (= домены и подстановочные домены). В этом случае у вас все еще есть возможность прочитать этот заголовок вручную в своем веб-приложении, если вы хотите обеспечить другое поведение в зависимости от адресов разных доменов. Это возможно, потому что в вашем веб-сервере вы можете (и если я не ошибаюсь, вы должны) настроить один vhost в качестве хоста по умолчанию. Этот vhost по умолчанию используется всякий раз, когда host-header не соответствует ни одному из настроенных виртуальных хостов.

Это означает, что вы понимаете это правильно, хотя выражение "несколько хостов" может несколько вводить в заблуждение: хост (адресуемая машина) одинаков, то, что действительно разрешается к IP-адресу, - это разные доменные имена (включая субдомены), на которые также ссылаются в качестве имен хостов (но не хостов!).

Хотя это и не часть вопроса, забавный факт: эта спецификация привела к проблемам с SSL в первые дни, потому что веб-сервер должен доставить сертификат, соответствующий домену, к которому обратился клиент. Однако, чтобы узнать, какой сертификат использовать, веб-сервер должен был заранее знать имя хоста. Но поскольку клиент отправляет эту информацию только по зашифрованному каналу (что означает: после того, как сертификат уже отправлен), сервер должен был предположить, что вы просматривали хост по умолчанию. Это означало: один ssl-защищенный домен на IP-адрес / комбинацию портов.

Однако это было преодолено с помощью индикации имени сервера, которая снова нарушает некоторую конфиденциальность, поскольку имя сервера теперь снова передается в виде простого текста, поэтому каждый посредник будет видеть, к какому имени хоста вы пытаетесь подключиться.

Хотя веб-сервер будет знать имя хоста из указателя имени сервера, host-header не устарел, потому что информация об указании имени сервера используется только при подтверждении связи TLS. При незащищенном соединении вообще отсутствует указание имени сервера, поэтому host-заголовок все еще действителен (и необходим).

Еще один забавный факт: большинство веб-серверов (если не все) отклоняют ваш http-запрос, если он не содержит ровно один host-header, даже если он может быть опущен, потому что настроен только vhost по умолчанию. Это означает, что минимальная необходимая информация в запросе http-(get-) - это первая строка, содержащая METHODRESOURCE а также PROTOCOL VERSION и по крайней мере hostзаголовок, как это:

GET /someresource.html HTTP/1.1
Host: www.example.com

Вы можете прочитать документацию MDN на Host-Header для получения дополнительной информации, которая гласит:

Поле заголовка узла должно быть отправлено во всех сообщениях запроса HTTP/1.1. Код состояния 400 (неверный запрос) будет отправлен на любое сообщение с запросом HTTP/1.1, в котором отсутствует поле заголовка узла или имеется более одного.

Как упомянул Даррел Миллер, полные спецификации можно найти в RFC7230.

Я всегда рекомендовал бы обращаться к авторитетному источнику при попытке понять значение и назначение заголовков HTTP.

Поле заголовка "Host" в запросе предоставляет хост и порт
информация из целевого URI, позволяющая исходному серверу
различать ресурсы при обслуживании запросов для нескольких
имена хостов на одном IP-адресе.

https://tools.ietf.org/html/rfc7230

HTTP 1.1, заголовок узла - это третья часть информации, которую вы можете использовать в дополнение к IP-адресу и номеру порта для уникальной идентификации веб-домена или, как называет это Microsoft, сервера приложений. Например, имя заголовка узла для URL www.example.com - www.example.com. Браузер HTML 3.0 или более поздней версии поддерживает HTTP 1.1. Браузер содержит имя заголовка хоста, указанное вами в поле расположения заголовка запроса, который браузер отправляет на сервер. Если вы не укажете имя заголовка узла в заголовке запроса, корневой веб-домен будет действовать как веб-сервер по умолчанию.

Другие вопросы по тегам