Host
Применение
Каждый запрос HTTP/1.1 содержит заголовок Host. Этот заголовок делает возможным виртуальный хостинг, когда один сервер с единственным IP-адресом обслуживает несколько доменов. Без Host у сервера нет способа определить, на какой домен рассчитывал попасть клиент.
Значение содержит запрошенное имя хоста и необязательный номер порта, отделённый двоеточием. Если порт не указан, применяется порт по умолчанию для схемы: порт 80 для HTTP и порт 443 для HTTPS.
Сервер, получивший запрос HTTP/1.1 без заголовка Host, отвечает 400 Bad Request. Тот же ответ следует, когда запрос содержит более одного заголовка Host, так как эта неоднозначность не позволяет серверу выбрать правильный виртуальный хост.
В HTTP/2 и HTTP/3 заголовок Host заменяет псевдозаголовочное поле :authority. Клиенты, отправляющие запросы HTTP/2 или HTTP/3, помещают сведения о хосте в :authority. Когда шлюз преобразует запрос HTTP/2 в HTTP/1.1, он формирует заголовок Host из значения :authority.
Заголовок Host отличается от заголовка Origin. Host определяет целевой сервер для каждого запроса. Origin определяет источник кросс-доменного запроса и появляется только в особых случаях, таких как предварительные запросы CORS и отправка форм.
host
Доменное имя или IP-адрес целевого сервера.
port
Необязательный номер TCP-порта. Если он опущен, подразумевается порт по умолчанию для схемы запроса (80 для HTTP, 443 для HTTPS).
Host: <host>:<port>
Пример
В обычном HTTPS-запросе к веб-серверу порт опускается, поскольку 443 — порт по умолчанию для HTTPS.
GET /articles/http-headers HTTP/1.1
Host: example.re
Когда сервер работает на нестандартном порту, номер порта указывается после имени хоста.
GET /api/status HTTP/1.1
Host: api.example.re:8443
Запрос к IP-адресу содержит адрес напрямую. Такая форма распространена в средах разработки и во внутренних сервисах.
GET /health HTTP/1.1
Host: 192.168.1.100:3000
Безопасность
Инъекция заголовка Host возникает, когда приложения используют значение Host для формирования URL (ссылок сброса пароля, канонических URL, перенаправлений), предварительно не проверив это значение. Злоумышленник отправляет запрос с поддельным значением Host, из-за чего приложение генерирует ссылки, ведущие на подконтрольный ему домен.
Проверяйте заголовок Host по белому списку ожидаемых значений. В nginx задайте server_name и добавьте универсальный блок server по умолчанию, возвращающий 444. В Django укажите в ALLOWED_HOSTS список разрешённых доменов. В Rails настройте host_authorization в окружении приложения. Браузеры считают Host запрещённым заголовком запроса, не позволяя клиентскому JavaScript изменять его значение, однако на запросы между серверами и на инструменты вроде curl такое ограничение не распространяется.