308 Redirect: постоянное перенаправление с сохранением метода
Что такое HTTP 308, чем он отличается от 301 и 307, когда его необходимо использовать для API и форм, и как настроить на сервере.
308 Permanent Redirect — HTTP-статус постоянного перенаправления, который обязывает клиента повторить запрос на новый URL с тем же методом (POST, PUT, PATCH и т.д.) и телом запроса. В отличие от 301, браузер не меняет метод на GET. Поисковые системы трактуют 308 как постоянный редирект: ссылочный вес передаётся на новый URL, старый URL удаляется из индекса.
Что такое 308 редирект
308 Permanent Redirect — это HTTP-статус, стандартизированный в RFC 7538 (2015). Он сообщает клиенту: «Запрошенный ресурс навсегда перемещён на новый URL. Повтори запрос туда же, сохранив метод и тело». Ключевое слово — «навсегда»: в отличие от 307, который временный, 308 является постоянным и сигнализирует поисковым системам о необходимости обновить индекс и передать ссылочный вес.
Код 308 закрывает пробел в спецификации HTTP: до его появления разработчики сталкивались с дилеммой — 301 постоянный, но браузеры де-факто меняют POST на GET; 307 сохраняет метод, но только для временных перемещений. 308 объединяет постоянность 301 и гарантию сохранения метода 307.
308 vs 301 vs 307 vs 302: в чём разница
Четыре кода перенаправления отличаются по двум осям: постоянность и сохранение 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
- Постоянная миграция API-эндпоинтов: когда клиенты отправляют PUT/PATCH/DELETE и нужно навсегда перенести эндпоинт на новый адрес без потери тела запроса.
- Переезд форм на новый URL: при постоянном изменении адреса формы регистрации или оформления заказа — сохраняем POST-данные.
- Смена версии API: переход с /api/v1/ на /api/v2/ при постоянном отказе от старой версии с сохранением метода запроса.
- HTTPS-апгрейд для POST-эндпоинтов: при постоянном переходе с HTTP на HTTPS для форм и API, где важно сохранить метод и тело запроса.
- Реструктуризация маршрутов: при постоянном переносе обработчиков форм в новую структуру приложения.
Влияние 308 на SEO
С точки зрения поисковых систем 308 — это постоянный редирект, аналогичный 301. Google и Bing передают ссылочный вес (PageRank, link equity) через 308: старый URL удаляется из индекса, новый получает авторитет старого. Обработка 308 поисковыми роботами идентична 301 — Googlebot следует за редиректом и обновляет индекс.
На практике для SEO-специалистов разница между 301 и 308 несущественна — оба передают вес, оба постоянные. Выбор кода становится важен только в контексте API и форм: если приложение использует POST/PUT/PATCH-запросы и метод критичен, предпочтительнее 308. Для обычных HTML-страниц с GET-запросами используйте привычный 301.
Как настроить 308 редирект
Примеры для основных серверных окружений:
# Nginx: постоянный редирект с сохранением метода
server {
listen 80;
server_name example.com;
# Весь HTTP-трафик → HTTPS (308 сохранит POST-тело и постоянный)
return 308 https://example.com$request_uri;
}
# Постоянный перенос API-эндпоинта
location /api/v1/ {
return 308 https://example.com/api/v2/;
}# Apache (.htaccess)
# Постоянный редирект одного URL с сохранением метода
Redirect 308 /old-endpoint https://example.com/new-endpoint
# или через mod_rewrite
RewriteEngine On
RewriteRule ^api/v1/(.*)$ https://example.com/api/v2/$1 [R=308,L]// Next.js (next.config.js) — постоянный редирект
// Примечание: Next.js использует 301 для permanent: true
// Для точного 308 используйте middleware:
import { NextResponse } from 'next/server';
export function middleware(request) {
if (request.nextUrl.pathname.startsWith('/api/v1/')) {
const newUrl = request.nextUrl.clone();
newUrl.pathname = newUrl.pathname.replace('/api/v1/', '/api/v2/');
return NextResponse.redirect(newUrl, { status: 308 });
}
}<?php
// PHP: явный 308
http_response_code(308);
header('Location: https://example.com/new-endpoint');
exit();
?># Проверка через curl — убедитесь, что ответ именно 308
curl -I -X POST https://example.com/old-endpoint
# HTTP/2 308
# location: https://example.com/new-endpointЧастые вопросы
Обсудим ваш проект?
Расскажите о целях и сайте — предложу формат работы и следующий шаг.