Код статуса HTTP 302 (302 Found): что значит и когда использовать

Advertisement
Что такое код статуса HTTP 302?
Код статуса HTTP 302 — официально называемый 302 Found — это код HTTP-ответа, сообщающий клиенту (обычно браузеру), что запрашиваемый ресурс был временно перемещён на другой URL. Новый URL указывается в заголовке Location ответа, и клиент должен получить ресурс оттуда только для этого запроса.
Поскольку перемещение временное, клиент должен и дальше использовать оригинальный URL для будущих запросов. Поисковые системы, браузеры и закладки не должны заменять оригинальный URL целью перенаправления. Это ключевое поведенческое отличие между HTTP 302 и 301 Moved Permanently.
Код 302 относится к классу 3xx перенаправлений HTTP-кодов статуса, определённых в RFC 9110. Несмотря на историческое название «Found», тело ответа почти никогда не используется — современные браузеры сразу следуют за заголовком Location, не отрисовывая его.
Структура ответа 302
Ответ с кодом статуса HTTP 302 всегда содержит два обязательных элемента: саму строку статуса и заголовок Location, указывающий на новый URL. Без корректного заголовка Location клиент не сможет проследовать перенаправление.
Строка статуса —
HTTP/1.1 302 Found(илиHTTP/2 302в HTTP/2)Заголовок Location — целевой URL, за которым должен проследовать клиент (обязателен)
Cache-Control — обычно
no-cache, чтобы браузеры не кэшировали цель перенаправления навсегдаТело — обычно пустое; серверы могут включить небольшую HTML-страницу для legacy-клиентов (
<html><body><a href="...">Нажмите здесь</a></body></html>)
HTTP/1.1 302 Found
Location: https://www.example.com/new-page
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Cache-Control: no-cache, no-store
Date: Mon, 27 Apr 2026 14:00:00 GMTЗаголовок Location может быть абсолютным URL (https://example.com/path) или относительным к пути (/path). Современные HTTP-клиенты принимают оба варианта, но абсолютные URL рекомендуются для ясности.
302 vs 301 vs 307 vs 308: какое перенаправление выбрать?
HTTP определяет пять основных кодов перенаправления, и выбор правильного важен для кэширования, SEO и сохранения метода запроса. Используйте таблицу как матрицу решений:
| Код | Постоянство | Метод сохраняется? | Кэшируется браузером? | Лучшее применение |
|---|---|---|---|---|
| 301 Moved Permanently | Постоянное | Может изменить POST→GET | Да (агрессивно) | Постоянные изменения URL, миграция домена |
| 302 Found | Временное | Часто меняет POST→GET | Нет | Логин-флоу, A/B-тесты, обслуживание |
| 303 See Other | Временное | Всегда меняет на GET | Нет | Шаблон POST/Redirect/GET после отправки формы |
| 307 Temporary Redirect | Временное | Да — сохраняется | Нет | Временные перенаправления, требующие сохранения POST/PUT |
| 308 Permanent Redirect | Постоянное | Да — сохраняется | Да | Постоянные перенаправления, требующие сохранения POST/PUT |
Современная рекомендация: если нужен временный редирект и вы хотите однозначной обработки метода, используйте 307 вместо 302. Код 307 был добавлен в HTTP/1.1 именно потому, что браузеры исторически нарушали спецификацию, меняя POST на GET при 302 — и это неправильное поведение настолько распространилось, что стало де-факто стандартом.
Когда использовать редирект 302?
Используйте код статуса HTTP 302, когда перенаправление действительно временное — то есть вы планируете убрать или изменить цель в будущем. Распространённые легитимные сценарии:
Перенаправления при логине — Отправлять неаутентифицированного пользователя с
/dashboardна/login, а затем обратно после входаA/B-тестирование — Перенаправлять 50% пользователей на вариант, не меняя канонический URL
Страницы обслуживания — Временно перенаправлять весь трафик на
/maintenance, пока патчите серверГеолокационная маршрутизация — Отправлять посетителей с
/на/ruили/usпо стране, оставляя/каноническим входомМобильные перенаправления — Перенаправлять смартфон-пользователей с
example.comнаm.example.com(сегодня предпочтителен адаптивный дизайн)Страницы товаров без склада — Отправлять покупателей в категорию, пока товар не появится снова
Краткосрочные промо-URL —
/black-fridayперенаправляет на лендинг кампании только во время акции
Если что-то из этого станет постоянным, переключитесь на 301. Поисковые системы ждут несколько месяцев, прежде чем долго существующий 302 будет трактоваться как 301, поэтому оставление постоянного перемещения в 302 стоит сигналов ранжирования в этот период.
Advertisement
Как отправить код статуса 302
В большинстве веб-серверов и фреймворков есть встроенные хелперы для отправки редиректа 302. Ниже самые распространённые шаблоны. Каждый отправляет HTTP 302 Found с заголовком Location — это единственные два обязательных элемента ответа 302.
Nginx
В Nginx используйте директиву return с кодом 302 (по умолчанию, если код опущен, тоже 302):
server {
listen 80;
server_name example.com;
# Временный редирект (302 Found)
location /old-page {
return 302 https://example.com/new-page;
}
}Apache (.htaccess)
В Apache используйте Redirect с кодом 302 или RewriteRule с флагом [R=302,L]:
# Простой временный редирект
Redirect 302 /old-page https://example.com/new-page
# Или с mod_rewrite для сопоставления по шаблону
RewriteEngine On
RewriteRule ^maintenance$ /maintenance.html [R=302,L]Node.js (Express)
Метод res.redirect() в Express по умолчанию использует 302, если код не указан:
// Временный редирект (302 Found по умолчанию)
app.get('/dashboard', (req, res) => {
if (!req.user) {
return res.redirect('/login') // отправляет 302
}
// ...рендер dashboard
})
// Или явно:
res.redirect(302, '/login')Как проверить код статуса 302
После реализации редиректа 302 убедитесь, что он работает корректно. Самый быстрый способ — curl из терминала: он показывает точный код статуса и заголовок Location без вмешательства браузерного кэша.
# Показать только заголовки ответа (-I), не следуя за редиректом
curl -I https://example.com/old-page
# Ожидаемый вывод:
# HTTP/2 302
# location: https://example.com/new-page
# cache-control: no-cache
# date: Mon, 27 Apr 2026 14:00:00 GMT
# Пройти всю цепочку (-L) и показать каждый хоп
curl -ILs https://example.com/old-page | grep -i 'HTTP/\|location:'Если у вас нет доступа к терминалу, используйте бесплатный Проверщик редиректов DNS Robot для отслеживания всей цепочки с нейтральной локации, или Проверщик HTTP-заголовков для просмотра сырых заголовков ответа — оба обходят браузерный кэш.
Редиректы 302 и SEO
Код статуса HTTP 302 сообщает поисковым системам: «это перемещение временное, оставьте оригинальный URL в индексе.» Это имеет прямые последствия для сигналов ранжирования.
Согласно Google Search Central, 302 не передаёт сигналы ранжирования с оригинального URL на цель редиректа так, как это делает 301. Оригинальный URL остаётся каноническим. Google всё ещё может индексировать целевую страницу, если на неё указывают другие сигналы канонизации (внутренние ссылки, sitemap, hreflang) — но сам 302 не является каноническим сигналом.
Используйте 301 для постоянных перемещений — Смены домена, изменения структуры URL, объединение страниц
Используйте 302 для временных перемещений — Логин-флоу, A/B-тесты, обслуживание, региональная маршрутизация
Не оставляйте постоянное перемещение в 302 — Google ждёт месяцы, прежде чем долгий 302 будет трактоваться как 301, теряя equity ранжирования
Избегайте цепочек —
A → 302 → B → 302 → Cразмывает сигналы и замедляет загрузку. Каждый хоп добавляет задержку
Почему 302 меняет POST-запросы на GET
Это самое удивительное поведение HTTP 302. Оригинальный RFC говорил, что клиенты должны сохранять метод запроса при следовании за редиректом. Но ранние браузеры — Mosaic, Netscape, IE — все меняли POST на GET при 302, и это неправильное поведение настолько распространилось, что было стандартизировано в WHATWG Fetch Standard.
Сегодня, когда браузер отправляет POST /login и сервер отвечает 302 Found, браузер автоматически отправляет GET /next-page к цели редиректа. Данные формы теряются. Это редко то, что задумывают разработчики сервера.
# Что вы отправляете:
POST /submit-form HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
name=Alice&email=alice@example.com
# Сервер отвечает 302:
HTTP/1.1 302 Found
Location: /thank-you
# Браузер следует с GET (данные формы теряются!):
GET /thank-you HTTP/1.1
Host: example.comЕсли редирект должен сохранить оригинальный метод (POST остаётся POST, PUT остаётся PUT), используйте 307 Temporary Redirect вместо 302. Если хотите намеренно отбросить тело и переключиться на GET — классический шаблон POST/Redirect/GET — используйте 303 See Other. Оба однозначны; 302 — нет.
Advertisement
Частые проблемы с 302 и как их исправить
Когда HTTP 302 идёт не так, обычно это проявляется одним из этих симптомов. У большинства простые решения:
`Получаю 302 вместо 200` — Сервер делает редирект, когда не должен. Проверьте
.htaccess, конфигурацию Nginx или middleware фреймворка на нежелательные правила`302 без заголовка Location` — Невалидный ответ. Браузеры покажут пустую страницу. Убедитесь, что код устанавливает заголовок
Locationдо отправки статуса`302, перенаправляющий на самого себя` — Цикл редиректов. URL
Locationсовпадает с URL запроса. Проверьте правило на отсутствующие условия`302 теряет данные формы` — POST → 302 → GET отбрасывает тело. Переключитесь на
307 Temporary Redirect, чтобы сохранить POST`302 кэшируется браузером` — Багованный сервер выставил
Cache-Control: max-age=...на редирект. ДобавьтеCache-Control: no-cacheи очистите кэш браузера`302 в продакшене, но не локально` — Обычно CDN или балансировщик нагрузки добавляет редиректы. Тестируйте напрямую против origin, чтобы изолировать
Циклы редиректов 302: как диагностировать
Цикл редиректов возникает, когда URL A возвращает 302 к URL B, а URL B возвращает 302 обратно к A. После 20 хопов (в Chrome и Firefox) браузер показывает ERR_TOO_MANY_REDIRECTS и сдаётся.
Самая частая причина — конфликт SSL/HTTPS между CDN (например, Cloudflare) и origin-сервером: CDN подключается к origin по HTTP, origin делает редирект HTTP→HTTPS, CDN снимает HTTPS и снова подключается по HTTP — бесконечный цикл.
# Пройти всю цепочку (ограничить 10 хопами для избегания бесконечных циклов)
curl -ILs --max-redirs 10 https://example.com 2>&1 | grep -i 'HTTP/\|location:'
# Пример цикла:
# HTTP/2 302
# location: http://example.com/
# HTTP/1.1 302 Found
# Location: https://example.com/
# HTTP/2 302
# location: http://example.com/ <-- цикл подтверждёнЕсли видите два URL, чередующихся в заголовках Location, вы подтвердили цикл 302. Полное руководство см. в нашем посте ERR_TOO_MANY_REDIRECTS. Проверщик редиректов DNS Robot отслеживает всю цепочку из нейтральной локации и останавливается в точке цикла.
Лучшие практики для кода статуса 302
Правильная отправка 302 Found помогает избежать большинства ошибок, с которыми сталкиваются разработчики при реализации редиректов:
Всегда включайте заголовок Location —
302безLocationневалиден и отрисовывается как пустая страницаВсегда задавайте Cache-Control: no-cache — Иначе некоторые браузеры кэшируют редирект на сессию, нарушая «временный» контракт
Используйте абсолютные URL в Location —
https://example.com/newоднозначен;/newработает, но может сломаться за прокси, меняющими хостДержите редиректы в одном хопе —
A → 302 → Bнормально;A → 302 → B → 302 → Cзамедляет загрузку и размывает сигналыНе делайте редирект с POST на другую страницу через 302 — Используйте
303(намеренный GET) или307(сохранение POST)Аудитируйте редиректы ежемесячно — Старые временные редиректы часто переживают свою причину. Проверяйте через Redirect Checker
Переключайтесь на 301, когда перемещение становится постоянным — Не оставляйте постоянное перемещение в
302дольше нескольких недель
Поведение браузера и кэша
Разные браузеры и посредники обрабатывают HTTP 302 немного по-разному. Знание особенностей экономит время отладки:
| Клиент | Поведение по умолчанию для 302 | Кэш по умолчанию |
|---|---|---|
| Chrome / Edge | Авто-следование, меняет POST→GET | Не кэшируется, если заголовки не указывают |
| Firefox | Авто-следование, меняет POST→GET | Не кэшируется, если заголовки не указывают |
| Safari | Авто-следование, меняет POST→GET | Чуть более агрессивное кэширование редиректов |
| curl (по умолчанию) | НЕ следует — показывает 302 + Location | Без кэша |
| curl -L | Следует до --max-redirs (по умолч. 50) | Без кэша |
| wget (по умолчанию) | Авто-следование до --max-redirect=20 | Без кэша |
| Googlebot | Следует, трактует как временный сигнал | Перекраулит оригинальный URL |
Чтобы проверить поведение редиректов в крайних случаях (методы POST, бесконечные циклы, наличие заголовков), Проверщик HTTP-заголовков DNS Robot показывает сырой ответ без переписывания метода на стороне браузера. Подробнее о временных редиректах в документации MDN и спецификации RFC 9110.
Advertisement
Отследите любую цепочку редиректов за секунды
Используйте бесплатный Проверщик редиректов DNS Robot, чтобы инспектировать каждый хоп цепочки — коды статуса, заголовки Location и финальное назначение с нейтрального сервера (без браузерного кэша).
Попробовать Проверщик редиректовAdvertisement
Часто задаваемые вопросы
Код статуса 302 (HTTP 302 Found) означает, что запрашиваемый ресурс временно находится по другому URL, указанному в заголовке Location ответа. Клиент должен проследовать редиректу для этого запроса, но продолжать использовать оригинальный URL для будущих запросов. Это временный аналог 301 Moved Permanently.