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 .
vhost
только 3 совпаденияvirtual host
со смыслом, не близким к вашей фразе, и 12 вdefault
основном о порте,