В чем разница между HTTP 301 и 308 кодами состояния?
В чем разница между HTTP 301
а также 308
коды состояния?
301
(Перемещено постоянно): этот и все последующие запросы должны быть направлены на указанный URI.308
(Постоянное перенаправление): запрос и все последующие запросы должны повторяться с использованием другого URI.
Кажется, они похожи.
2 ответа
Обзор 301
, 302
а также 307
RFC 7231, текущий справочник по семантике и содержанию протокола HTTP/1.1, определяет 301
(Перемещено навсегда) и302
(Найдено) код состояния, позволяющий изменить метод запроса сPOST
в GET
, Эта спецификация также определяет307
Код временного перенаправления, который не позволяет изменять метод запроса сPOST
в GET
,
Смотрите более подробную информацию ниже:
6.4.2. 301 перемещено навсегда
301
Код состояния (перемещен постоянно) указывает, что целевому ресурсу был назначен новый постоянный URI, и любые будущие ссылки на этот ресурс должны использовать один из вложенных URI. [...]Примечание. По историческим причинам пользовательский агент МОЖЕТ изменить метод запроса с
POST
вGET
для последующего запроса. Если это поведение нежелательно,307
Вместо этого можно использовать код состояния (временное перенаправление).
302
(Найденный) код состояния указывает, что целевой ресурс временно находится под другим URI. Поскольку перенаправление может иногда изменяться, клиент должен продолжать использовать эффективный URI запроса для будущих запросов. [...]Примечание. По историческим причинам пользовательский агент МОЖЕТ изменить метод запроса с
POST
вGET
для последующего запроса. Если это поведение нежелательно,307
Вместо этого можно использовать код состояния (временное перенаправление).
307
Код состояния (временное перенаправление) указывает, что целевой ресурс временно находится под другим URI, и пользовательский агент НЕ ДОЛЖЕН изменять метод запроса, если он выполняет автоматическое перенаправление на этот URI. Поскольку перенаправление со временем может измениться, клиент должен продолжать использовать исходный эффективный URI запроса для будущих запросов. [...]Примечание: этот код состояния похож на
302
(Найдено), за исключением того, что он не позволяет изменить метод запроса сPOST
вGET
, Эта спецификация не определяет эквивалентный аналог для301
(Перемещено навсегда) (однако RFC 7238 определяет код состояния308
(Постоянный редирект) для этой цели).
Нужда в308
RFC 7238 был создан для определения 308
(Постоянное перенаправление) код состояния, который похож на 301
(Перемещено навсегда), но не позволяет изменить метод запроса сPOST
вGET
,
308
Код состояния теперь определяется RFC 7538 (который устарел RFC 7238).
308
Код состояния (постоянное перенаправление) указывает, что целевому ресурсу был назначен новый постоянный URI, и любые будущие ссылки на этот ресурс должны использовать один из вложенных URI. Клиенты с возможностями редактирования ссылок должны автоматически повторно связывать ссылки с действующим URI запроса с одной или несколькими новыми ссылками, отправленными сервером, где это возможно. [...]Примечание: этот код состояния похож на
301
(Перемещено постоянно), за исключением того, что не позволяет изменить метод запроса сPOST
вGET
,
SE у нас есть следующее:
+-----------+-----------+
| Permanent | Temporary |
+------------------------------------------------------------+-----------+-----------+
| Allows changing the request method from POST to GET | 301 | 302 |
+------------------------------------------------------------+-----------+-----------+
| Doesn't allow changing the request method from POST to GET | 308 | 307 |
+------------------------------------------------------------+-----------+-----------+
Выбор наиболее подходящего кода статуса
Посмотрите на диаграмму ниже (извлечено из этой страницы):
Ниже упоминается обычное наблюдаемое поведение клиента при перенаправлении с использованием кодов состояния 3xx. Лучше всего протестировать эти сценарии с помощью вашего HTTP-клиента, поскольку он может не следовать по тому же пути, который указан ниже.
301
- Метод HTTP будет изменен на GET. Не только POST, но и DELETE, PUT, PATCH и т. д. (кроме HEAD).
- При перенаправлении большинство заголовков будут сохранены, но некоторые конфиденциальные заголовки, такие как авторизация, будут удалены.
- Тот же домен, разные схемы перенаправления (например, перенаправление http на https) также сохранят конфиденциальные заголовки.
- Тело может быть удалено, а может и не удалено. Поскольку метод изменен на GET, в большинстве случаев это не имеет значения.
- Указывает на то, что поисковые системы могут обновлять свои ссылки на ресурс.
302
- То же, что 301, но для временного перенаправления. Браузер перенаправляет на эту страницу, но поисковые системы не обновляют ссылки на ресурс.
308
- Метод HTTP не изменится.
- Большинство заголовков будут сохранены, но некоторые конфиденциальные заголовки, такие как авторизация, будут удалены. (исключение с перенаправлениями того же домена)
- Тело сохранится.
- Поисковые системы могут обновлять свои ссылки на ресурс.
307
- То же, что 308, но для временного перенаправления. Браузер перенаправляет на эту страницу, но поисковые системы не обновляют ссылки на ресурс.
303
- Это полезно, если вы хотите дать ответ на метод PUT или POST, который не является загруженными ресурсами, а подтверждает сообщение (например, «Вы успешно загрузили XYZ») с использованием перенаправления GET. Результат исходного HTTP-запроса можно найти по другому URL-адресу, который можно отдельно идентифицировать, добавить в закладки и кэшировать независимо от исходного запроса. Кроме того, обновление страницы результатов не приводит к повторному запуску операции POST/PUT. Некоторые приложения для этой цели используют HTTP-ответ 302 Found.
- Все методы HTTP, кроме HEAD, будут изменены на GET.
- При перенаправлении большинство заголовков будут сохранены, но некоторые конфиденциальные заголовки, такие как авторизация, будут удалены. (исключение с перенаправлениями того же домена)
300
- Код ответа на статус перенаправления с множественным выбором указывает, что запрос имеет более одного возможного ответа, и клиент должен выбрать один из них.