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

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

Ответы

Ответ 1

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

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

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

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

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

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

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

В документации MDN на хосте -header они фактически формулируют это так:

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

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

Ответ 2

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

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

https://tools.ietf.org/html/rfc7230#section-5.4

Ответ 3

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