Что означают HTTP-коды состояния 3xx?

Ответ

HTTP-коды состояния 3xx (Redirection) информируют клиента о том, что для завершения запроса необходимо предпринять дополнительные действия, обычно — обратиться по другому URI (адресу).

Ключевые коды и их семантика:

Код Название Назначение Кешируемость
301 Moved Permanently Ресурс навсегда перемещен на новый URL. Браузеры и поисковики обновляют ссылки. Да
302 Found (ранее Moved Temporarily) Ресурс временно доступен по другому адресу. Последующие запросы должны идти к исходному URL. По умолчанию нет
307 Temporary Redirect Аналогичен 302, но гарантирует, что метод запроса (GET/POST) не будет изменен при редиректе. Нет
308 Permanent Redirect Аналогичен 301, но гарантирует сохранение метода запроса. Да
304 Not Modified Ответ на условный запрос (с заголовками If-Modified-Since или If-None-Match). Контент не изменился, клиент должен использовать кешированную версию.

Пример ответа сервера с редиректом 301:

HTTP/1.1 301 Moved Permanently
Location: https://new-example.com/api/v2/resource
Content-Length: 0

Важно: Для POST-запросов использование 301/302 может привести к изменению метода на GET при следующем запросе. Для безопасного перенаправления POST-запросов используйте 307 или 308.

Ответ 18+ 🔞

А, слушай, вот эта вся хуйня с перенаправлениями в HTTP! Ну, типа, сервер такой: «Э, дружок-пирожок, иди-ка ты нахуй отсюда, но не просто так, а вот туда». Это как если бы ты пришёл в паб, а бармен такой: «Мы, блядь, переехали, новый адрес — на соседней улице».

Основные коды, которые тебе вломит сервер, если он решил, что ты не там ищешь:

Код Как это назвали умники Что это значит на самом деле Кеш запомнит?
301 Переехал навсегда Ресурс насовсем свалил на новый адрес. Браузеры и Гугл с Яндексами должны обновить свои записочки. Ага
302 Нашли (раньше «Временно перемещён») Ресурс пока что тусуется по другому адресу. Но в следующий раз стучись в старую дверь. Обычно нет
307 Временный редирект Почти как 302, но тут тебе гарантируют, что если ты пришёл с POST-запросом (ну, типа, форму отправить), то и после редиректа он останется POST'ом, а не превратится в GET. Нет
308 Постоянный редирект Брат-близнец 301, но тоже с гарантией, что метод запроса не поменяется. Насовсем, но с сохранением сути. Да
304 Не изменено Это когда ты такой умный и спрашиваешь сервер: «Эй, а у тебя там что-нибудь новенькое с [такой-то даты]?». А он тебе: «Нихуя не изменилось, юзай то, что у тебя в кеше лежит».

Вот как выглядит пинок от сервера с редиректом 301:

HTTP/1.1 301 Moved Permanently
Location: https://new-example.com/api/v2/resource
Content-Length: 0

Важный момент, блядь: Если ты шлёшь POST-запрос (например, форму логина), а сервер в ответ — 301 или 302, то некоторые старые браузеры или клиенты могут, ебать, превратить следующий запрос в GET, и всё сломается. Поэтому для POST'ов юзай 307 (временно) или 308 (навсегда), они честные, метод не сломают.