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

122

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

VladimirLenin
источник

Ответы:

144

hostЗаголовок сообщает веб - сервер , который виртуальный хост для использования (если он настроен). У вас даже может быть один и тот же виртуальный хост, используя несколько псевдонимов (= домены и домены с подстановочными знаками). В этом случае у вас все еще есть возможность прочитать этот заголовок вручную в своем веб-приложении, если вы хотите обеспечить различное поведение на основе разных адресованных доменов. Это возможно, потому что на вашем веб-сервере вы можете (и если я не ошибаюсь, вы должны) настроить один виртуальный хост в качестве хоста по умолчанию. Этот виртуальный хост по умолчанию используется всякий раз, когда 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 о заголовке хоста они фактически формулируют это так:

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

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

пси
источник
хороший ответ. Вы написали: «Это возможно, потому что на вашем веб-сервере вы можете (и, если я не ошибаюсь, вы должны) настроить один виртуальный хост в качестве хоста по умолчанию. Этот виртуальный хост по умолчанию используется всякий раз, когда заголовок хоста не соответствует ни одному из настроенных виртуальных хосты «. Я хотел проверить RFC7230, но не нашел vhostтолько 3 совпадения virtual hostсо смыслом, не близким к вашей фразе, и 12 в defaultосновном о порте,
Алексей Мартьянов
о хосте только то, что: «Если нет, то если поле заголовка хоста снабжено непустым значением поля, то компонент полномочий такой же, как значение поля хоста». - не то же ИМХО. Можете ли вы указать мне на это в RFC?
Алексей Мартьянов
Практическая сторона: на какой-то сервер я отправляю POST с заголовком host = domain name и получаю 200 (хорошо), я отправляю измененный заголовок хоста и получаю 404 (не найдено). Может ли это означать, что сервер by the bookнастроен неправильно (полностью )?
Алексей Мартьянов
так как комментарий нельзя редактировать: цитата во 2-м оказалась рядом с defaultсловом, найденным поиском,Otherwise, the authority component is assigned the default name configured for the server
Алексей Мартьянов
странный. все 3 вхождения, virtual hostнайденные моим поиском в tools.ietf.org/html/rfc7230, находятся в форматеAppendix A. HTTP Version History . похоже, что ваш поиск нашел другое.
Алексей Мартьянов
30

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

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

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

Даррел Миллер
источник