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 = «302, но метод не трогать». 308 = «301, но метод не трогать». Если перемещение постоянное и важен метод — 308. Если временное — 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 и форм.
308 поддерживается всеми современными браузерами (Chrome 36+, Firefox 18+, Edge, Safari 7.1+), но некоторые старые HTTP-клиенты и прокси его не понимают. Для максимальной совместимости в легаси-окружениях используйте 307.

Когда использовать 307

  • HTTPS-апгрейд для POST-запросов: если сайт принимает формы по HTTP и нужно перенаправить их на HTTPS без потери тела запроса.
  • API-редиректы при временном переезде эндпоинта: когда клиент отправляет PUT/PATCH/DELETE и нужно временно направить трафик на другой хост или версию API.
  • Балансировка нагрузки и failover: при временном отключении ноды отправляем запросы на резервный сервер с тем же методом.
  • Геолокационные перенаправления: временно направляем пользователей на региональную версию, при этом сохраняем метод, если они отправляют формы.
  • A/B-тестирование форм: временно направляем часть POST-трафика на тестовый вариант без изменения метода.
  • Технические работы: сохраняем POST-запросы при временном обслуживании основного URL.
Никогда не используйте 307 для постоянных переездов — поисковые системы не передадут ссылочный вес, а старый URL останется в индексе. Для постоянных перемещений с сохранением метода используйте 308, без — 301.

Влияние 307 на SEO

С точки зрения поисковых систем 307 — это временный редирект. Google и Bing не передают ссылочный вес (PageRank, link equity) через 307: старый URL остаётся в индексе, новый не получает дополнительного авторитета. Если 307 стоит достаточно долго (несколько месяцев), Google может переоценить его как постоянный — аналогично поведению с 302.

На практике 307 встречается в SEO-аудитах в двух контекстах: HTTPS-редиректы (где он корректен для POST, но для GET-страниц лучше использовать 301) и цепочки редиректов. Каждый дополнительный шаг в цепочке — будь то 307, 302 или 301 — добавляет задержку и может ухудшить LCP. Старайтесь избегать цепочек длиннее двух переходов.

Для обычных HTML-страниц (GET-запросы) разница между 302 и 307 с точки зрения SEO отсутствует — оба временные, оба не передают вес. Выбор кода становится важен только при POST/PUT/PATCH-запросах.

Как настроить 307 редирект

Примеры для основных серверных окружений:

NGINX
# 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
# 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]
JAVASCRIPT
// 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
// PHP: явный 307
http_response_code(307);
header('Location: https://example.com/new-endpoint');
exit();
?>
BASH
# Проверка через curl — убедитесь, что ответ именно 307
curl -I -X POST https://example.com/old-endpoint
# HTTP/2 307
# location: https://example.com/new-endpoint

Частые вопросы

Оба временные и оба не передают ссылочный вес. Разница в поведении с методом: 302 де-факто меняет POST на GET в большинстве браузеров, 307 — нет. Для GET-страниц разницы нет, для POST-форм и API — принципиальная.
Нет. 307 — временный редирект, как и 302. Поисковые системы сохраняют старый URL в индексе и не передают PageRank на новый. Для передачи веса используйте 301 (без гарантии метода) или 308 (с гарантией).
307 — для временного перемещения (акция, failover, A/B-тест). 308 — для постоянного переноса API-эндпоинта или формы. Если не уверены, что перемещение постоянное — ставьте 307 и при необходимости замените на 308 позже.
Для HTML-страниц (GET) предпочтительнее 301: он постоянный и передаёт вес. Для эндпоинтов, принимающих POST-данные (формы, API), используйте 307, чтобы не потерять тело запроса при редиректе.
Используйте curl -I -X POST <URL> и смотрите на строку статуса. В браузере: DevTools → Network → найдите запрос к старому URL → колонка Status. Screaming Frog также показывает коды редиректов при краулинге.
Прямые контакты

Обсудим ваш проект?

Расскажите о целях и сайте — предложу формат работы и следующий шаг.

307 Redirect: временное перенаправление с сохранением метода — что это такое?