Код 308 Permanent Redirect: постоянный редирект без смены метода
Код 308 Permanent Redirect означает, что ресурс навсегда переехал на новый URL и клиент должен повторить запрос по нему тем же методом и с тем же телом. Это «301, который не превращает POST в GET».
Обновлено 11 октября 2026 г.
Что значит код 308
Код 308 появился в RFC 7538 и сейчас описан в RFC 9110 (раздел 15.4.9). Он работает как 301: новый постоянный адрес указан в заголовке Location, а ответ по умолчанию кешируется. Отличие одно: клиент обязан сохранить метод запроса и тело. Для POST, PUT или DELETE это существенно: 301 мог превратить их в GET и потерять данные.
HTTP/1.1 308 Permanent Redirect
Location: https://example.com/api/v2/ordersКак выбрать между 301, 302, 307 и 308
| Метод может смениться на GET | Метод и тело сохраняются | |
|---|---|---|
| Постоянный | 301 Moved Permanently | 308 Permanent Redirect |
| Временный | 302 Found | 307 Temporary Redirect |
Практическое правило: для обычных страниц, открываемых GET, достаточно 301; 308 нужен, когда через редирект проходят запросы с телом (API, формы, webhook).
Когда использовать 308
- переезд API-эндпойнта на новый адрес, когда клиенты шлют POST или PUT;
- перевод всего сайта или API на HTTPS, если на HTTP приходят не только GET;
- смена домена у сервиса, принимающего webhook-вызовы;
- фреймворк сам выбирает 308: например, в Next.js редиректы с
permanent: trueотдают именно 308.
Что делать посетителю
Ничего: браузер перейдёт на новый адрес сам. Если страница не открывается и пишет о зацикливании, очистите cookie и кеш сайта: 308, как и 301, браузеры запоминают. Подробнее в разборе ERR_TOO_MANY_REDIRECTS.
Как настроить 308 владельцу сайта
server {
listen 80;
server_name example.com;
return 308 https://example.com$request_uri;
}Redirect 308 /api/v1/ https://example.com/api/v2/module.exports = {
async redirects() {
return [
{ source: "/old-page", destination: "/new-page", permanent: true }, // 308
];
},
};Редирект, настроенный для страниц сайта, проще собрать в генераторе 301-редиректов, а затем при необходимости заменить код. Подробности по Next.js в руководстве.
Как безопасно перейти на 308
- Составьте список старых и новых адресов и проверьте, что на новых отвечает 200.
- Включите редирект на тестовом адресе или на части трафика и проверьте методы GET, POST и HEAD.
- Убедитесь, что клиенты API обрабатывают редиректы и сохраняют метод (библиотеки в большинстве случаев так и делают, но у части нужно включить следование редиректам).
- Обновите ссылки внутри сайта, sitemap и canonical на новые адреса, чтобы редирект работал только для внешних обращений.
- Проследите за логами: сколько запросов по-прежнему идёт на старые адреса и откуда.
Типичные ошибки и совместимость
- 308 вместо 301 «на всякий случай». Для страниц это ничего не даёт. Код 308 появился позже, и очень старые клиенты или самописные боты могут его не знать и воспринять как ошибку.
- Редирект «навсегда» для временного переезда. 308 кешируется браузерами, и откатить его будет непросто. Сначала проверьте цель на тестовом адресе, а на время тестов используйте 307.
- Цепочки. Не оставляйте связку http → https → www → новый путь: сразу отправляйте на итоговый адрес за один шаг.
- Забытые старые правила. После перехода на 308 убедитесь, что старые правила 301 не создают второй переход.
Как 308 видят Яндекс и Google
Google относит 301 и 308 к постоянным редиректам: оба служат сильным сигналом, что новый URL должен стать каноническим. Яндекс также воспринимает 308 как постоянное перенаправление. Если выбор между 301 и 308 произвольный (страницы, GET-запросы), оставайтесь на 301: он поддерживается всеми клиентами и инструментами. Переход на 308 нужен только там, где важно сохранить метод запроса.
Как проверить
Откройте адрес в проверке кода ответа и убедитесь, что цепочка завершается на нужном URL с кодом 200 и состоит из одного шага. Через консоль: curl -sIL https://example.com/old-page | grep -iE "^(HTTP|location)".
Частые вопросы
Чем 308 отличается от 301?
Оба постоянные. При 308 клиент обязан сохранить метод и тело запроса, а при 301 может заменить POST на GET. Для обычных страниц на практике разницы нет.
Понимают ли Google и Яндекс код 308?
Google относит 308 к постоянным редиректам наряду с 301. Яндекс также обрабатывает его как постоянное перенаправление.
Почему Next.js отдаёт 308, а не 301?
Next.js использует 308 для редиректов с параметром permanent: true, чтобы метод запроса сохранялся. А для временных отдаёт 307.