307 Redirect: временное перенаправление с сохранением метода
Что такое HTTP 307, чем он принципиально отличается от 302 и 308, когда его обязательно использовать при работе с формами и API, и как настроить на сервере.
307 Temporary Redirect — HTTP-статус временного перенаправления, который обязывает клиента повторить запрос на новый URL с тем же методом (POST, PUT, PATCH и т.д.) и телом запроса. В отличие от 302, браузер не меняет метод на GET. Поисковые системы трактуют 307 как временный редирект: ссылочный вес не передаётся, старый URL остаётся в индексе.
Что такое 307 редирект
307 Temporary Redirect — это HTTP-статус, введённый в HTTP/1.1 (RFC 2616) и уточнённый в RFC 9110. Он сообщает клиенту: «Запрошенный ресурс временно доступен по другому адресу. Повтори запрос туда же, сохранив метод и тело». Ключевое слово — «сохранив»: если пользователь отправил POST-форму, 307 обязывает браузер отправить ещё один POST на новый URL, а не тихо переключиться на GET.
Именно это отличает 307 от 302: у 302 спецификация формально требует сохранения метода, но исторически большинство браузеров изменяли POST на GET при получении 302. Разработчики RFC зафиксировали эту «ошибку» как де-факто поведение для 302, а 307 стал кодом с гарантированным сохранением метода.
307 vs 302 vs 308 vs 301: в чём разница
Четыре кода перенаправления отличаются по двум осям: постоянность и сохранение HTTP-метода.
- 301 Moved Permanently — постоянный редирект, передаёт ссылочный вес. Метод формально должен сохраняться, но браузеры меняют POST→GET (поведение унаследовано от HTTP/1.0).
- 302 Found (Temporary) — временный редирект, вес не передаётся. Метод де-факто меняется POST→GET в большинстве браузеров.
- 307 Temporary Redirect — временный редирект, вес не передаётся. Метод гарантированно сохраняется (POST остаётся POST).
- 308 Permanent Redirect — постоянный редирект, передаёт ссылочный вес. Метод гарантированно сохраняется. Аналог 301 для API и форм.
Когда использовать 307
- HTTPS-апгрейд для POST-запросов: если сайт принимает формы по HTTP и нужно перенаправить их на HTTPS без потери тела запроса.
- API-редиректы при временном переезде эндпоинта: когда клиент отправляет PUT/PATCH/DELETE и нужно временно направить трафик на другой хост или версию API.
- Балансировка нагрузки и failover: при временном отключении ноды отправляем запросы на резервный сервер с тем же методом.
- Геолокационные перенаправления: временно направляем пользователей на региональную версию, при этом сохраняем метод, если они отправляют формы.
- A/B-тестирование форм: временно направляем часть POST-трафика на тестовый вариант без изменения метода.
- Технические работы: сохраняем POST-запросы при временном обслуживании основного URL.
Влияние 307 на SEO
С точки зрения поисковых систем 307 — это временный редирект. Google и Bing не передают ссылочный вес (PageRank, link equity) через 307: старый URL остаётся в индексе, новый не получает дополнительного авторитета. Если 307 стоит достаточно долго (несколько месяцев), Google может переоценить его как постоянный — аналогично поведению с 302.
На практике 307 встречается в SEO-аудитах в двух контекстах: HTTPS-редиректы (где он корректен для POST, но для GET-страниц лучше использовать 301) и цепочки редиректов. Каждый дополнительный шаг в цепочке — будь то 307, 302 или 301 — добавляет задержку и может ухудшить LCP. Старайтесь избегать цепочек длиннее двух переходов.
Как настроить 307 редирект
Примеры для основных серверных окружений:
# Nginx: временный редирект с сохранением метода
server {
listen 80;
server_name example.com;
# Весь HTTP-трафик → HTTPS (307 сохранит POST-тело)
return 307 https://example.com$request_uri;
}
# Конкретный путь
location /api/v1/ {
return 307 https://example.com/api/v2/;
}# Apache (.htaccess)
# Временный редирект одного URL
Redirect 307 /old-endpoint https://example.com/new-endpoint
# или через mod_rewrite
RewriteEngine On
RewriteRule ^api/v1/(.*)$ https://example.com/api/v2/$1 [R=307,L]// Next.js (next.config.js) — временный редирект
module.exports = {
async redirects() {
return [
{
source: '/api/v1/:path*',
destination: '/api/v2/:path*',
permanent: false, // permanent: false → 307
},
];
},
};<?php
// PHP: явный 307
http_response_code(307);
header('Location: https://example.com/new-endpoint');
exit();
?># Проверка через curl — убедитесь, что ответ именно 307
curl -I -X POST https://example.com/old-endpoint
# HTTP/2 307
# location: https://example.com/new-endpointЧастые вопросы
Обсудим ваш проект?
Расскажите о целях и сайте — предложу формат работы и следующий шаг.