Что означает HTTP статус-код 421?

Ответ

HTTP 421 Misdirected Request означает, что запрос был направлен на сервер, который не может дать ответ для указанного в заголовке Host имени.

Основная причина: Сервер, получивший запрос, не настроен для обработки запросов к указанному в заголовке Host домену. Это особенно актуально для серверов, обслуживающих несколько доменов.

Пример сценария:

  • Клиент отправляет запрос GET /api/data на IP-адрес сервера с заголовком Host: api.example.com.
  • Сервер на этом IP настроен отвечать только для домена example.com, но не для api.example.com.
  • Сервер отвечает: HTTP/1.1 421 Misdirected Request.

Контекст: Этот статус-код был введен в спецификации HTTP/2 для безопасного мультиплексирования запросов, когда один TCP-соединение используется для нескольких доменов.

Ответ 18+ 🔞

А, слушай, вот эта штука — 421-й код! Это ж классика, когда сервер такой: «Э, стопэ, дружок-пирожок, ты не туда попал, нахрен».

Представь себе: есть у тебя один здоровый сервер, а на нём висит, ну, дохуя разных сайтов. Как в общаге — одна дверь, а комнат — пиздец сколько. И вот ты стучишься в эту дверь и кричишь: «Откройте, это Ваня из 505-й!». А тебе из-за двери отвечают: «Бля, Ваня, ты охуел? Мы тут в 404-й живём, твоей 505-й тут нет, иди нахуй». Вот это и есть 421 Misdirected Request.

По-простому: Твой запрос пришёл по правильному IP-адресу, но в заголовке Host ты указал такое доменное имя, за которое этот конкретный сервер нихуя не отвечает. Он тебя не знает, он тебя не ждал.

Пример, чтобы вообще всё стало ясно: Допустим, у сервера IP 93.184.216.34. Он заточен только под сайт example.com. А ты, такой умный, шлёшь ему запрос:

GET /api/data HTTP/1.1
Host: api.example.com  <-- Вот эта хуйня!

Сервер смотрит на этот Host, чешет репу и думает: «api.example.com? А я, блядь, кто? Я — example.com! Я про эту твою апишку нихуя не знаю!». И в ответ плюёт тебе в лицо статусом:

HTTP/1.1 421 Misdirected Request

Сообщение: «Иди, дружок, ищи другой сервер, который за эту твою апишку отвечает. Ты не по адресу».

Откуда ноги растут? Эта фигня особенно актуальна для HTTP/2 и HTTP/3. Там, чтобы экономить, могут через одно TCP-соединение гонять запросы к разным доменам. И вот если соединение установлено с одним сервером, а ты через него пытаешься достучаться до другого домена, который он не обслуживает — он тебе как раз этим 421-м и намекнёт: «Э, сабака сука, не хитри, иди своим путём».

Короче, если увидел 421 — значит, твой клиент или прокси лажанулись с выбором сервера для конкретного доменного имени. Надо переслать запрос туда, где его ждут.