HTTPQUERY
Русский

308 Permanent Redirect

Применение

При получении кода состояния 308 Permanent Redirect от клиентов ожидается, что они обновят сохранённые ссылки на новый URI. Новый URI указывается заголовком Location и используется клиентом для автоматического перенаправления.

Такой ответ часто встречается, когда серверы переезжают на новый домен или реорганизуют свою внутреннюю структуру файлов без планов вернуться к прежнему URI.

Код состояния 308 Permanent Redirect отличается от 301 одной принципиальной деталью: клиент обязан сохранить исходный метод запроса. Ответ 301 разрешает клиенту при перенаправлении заменить запрос POST на GET. 308 Permanent Redirect требует, чтобы последующий запрос использовал тот же метод, что и исходный. Это делает 308 правильным выбором там, где важно сохранение метода, — например, для эндпоинтов API и отправки форм. Изначально код 308 был определён в отдельной спецификации, прежде чем войти в основной стандарт HTTP.

Влияние на SEO

Google обрабатывает 308 точно так же, как 301. Оба являются постоянными перенаправлениями и сильным сигналом того, что цель перенаправления каноническая. Ранжирующие сигналы передаются со старого URL на новый. Google проходит до 10 переходов по цепочке перенаправлений. Содержимое промежуточных URL перенаправления игнорируется. Единственное различие между 301 и 308 — сохранение метода, что важно для эндпоинтов API, но не для сканирования поисковой системой. Перенаправление удалённых URL на главную страницу или на обобщённую страницу категории с помощью 308 распознаётся Google как мягкий 404.

Пример

Клиент отправляет запрос POST к эндпоинту API. Сервер отвечает 308 Permanent Redirect, указывая, что эндпоинт переехал. Клиент обязан повторить запрос POST, включая исходное тело, по новому адресу Location.

Запрос

POST /api/v1/orders HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 35

{"item": "widget", "quantity": 10}

Ответ

HTTP/1.1 308 Permanent Redirect
Location: http://example.com/api/v2/orders
Content-Type: text/html; charset=UTF-8
Content-Length: 118

<h1>API endpoint moved</h1>
<body>
The orders endpoint has moved to
<a href=/api/v2/orders>/api/v2/orders</a>.
</body>

Примеры кода

.NET

HttpStatusCode.PermanentRedirect

Rust

http::StatusCode::PERMANENT_REDIRECT

Rails

:permanent_redirect

Go

http.StatusPermanentRedirect

Symfony

Response::HTTP_PERMANENTLY_REDIRECT

Python3.5+

http.HTTPStatus.PERMANENT_REDIRECT

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_PERMANENT_REDIRECT

Angular

@angular/common/http/HttpStatusCode.PermanentRedirect