Что такое 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-) - это первая строка, содержащая METHOD
RESOURCE
а также 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-адресе.
HTTP 1.1, заголовок узла - это третья часть информации, которую вы можете использовать в дополнение к IP-адресу и номеру порта для уникальной идентификации веб-домена или, как называет это Microsoft, сервера приложений. Например, имя заголовка узла для URL www.example.com - www.example.com. Браузер HTML 3.0 или более поздней версии поддерживает HTTP 1.1. Браузер содержит имя заголовка хоста, указанное вами в поле расположения заголовка запроса, который браузер отправляет на сервер. Если вы не укажете имя заголовка узла в заголовке запроса, корневой веб-домен будет действовать как веб-сервер по умолчанию.