Есть ли код состояния HTTP, который подходит для клиентов, которые отправляют неверное имя хоста (или вообще не отправляют) через SNI или заголовок HTTP-хоста?
An старый вопрос в первую очередь обсудите, как и почему возникают такие запросы, а также как вы можете технически справиться с ними в Apache. Однако он не касается выбора кода состояния для ответа.
В прошлом я реализовал прокси-сервер HTTP, который отправлял код состояния 502 и страницу html, объясняющую, почему было создано сообщение об ошибке. Моим обоснованием использования 502 было ожидание, что я увижу его в основном из-за неправильной конфигурации, что означало, что прокси-сервер не мог найти подходящий сервер. На самом деле оказалось, что гораздо чаще просто видеть полностью поддельные имена хостов.
Есть ли другой код состояния, который более подходит и четко сигнализирует клиенту, что сервер на этом IP-адресе не распознает значение, отправленное через SNI и / или заголовок Host?
RFC 6066 не указывает и даже не рекомендует какую-либо конкретную ошибку HTTP в случае, если имя хоста, отправленное через SNI, не соответствует заголовку хоста HTTP. Это делает рекомендуется, чтобы сервер прервал квитирование TLS, если имя хоста SNI не является тем, для которого он предоставляет услуги. Из Раздел 3:
Если сервер понял расширение ClientHello, но не распознает имя сервера, сервер ДОЛЖЕН выполнить одно из двух действий: либо прервать рукопожатие, отправив предупреждение unrecognized_name (112), либо продолжить рукопожатие.
Поскольку такой искаженный запрос может пройти после подтверждения TLS и должен быть отклонен в HTTP, необходим код ответа HTTP. Из всех существующих только один действительно подходит к ситуации:
6.5.1. ошибка 400, неверный запрос
Код состояния 400 (неверный запрос) указывает, что сервер не может или не будет обрабатывать запрос из-за чего-то, что воспринимается как ошибка клиента (например, неправильно сформированный синтаксис запроса, неверное формирование сообщения запроса или обманчивая маршрутизация запроса).
Фактически, это ответ, который определяет RFC 7230. Из Раздел 5.4 описывающий заголовок Host:
Сервер ДОЛЖЕН ответить кодом состояния 400 (неверный запрос) на любое сообщение запроса HTTP / 1.1, в котором отсутствует поле заголовка хоста, и на любое сообщение запроса, которое содержит более одного поля заголовка хоста или поле заголовка хоста с недопустимым значением поля. .
Я настоятельно рекомендую против используя 502 для этого. Его семантика указывает на то, что что-то не так с сервер сторона и что запрос будет успешным, если попытаться позже.