Ответ 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.