Какая разница между HTTP 301 и 308 кодами состояния?

В чем разница между кодами статуса HTTP 301 и 308?

  • 301 (перемещается постоянно): этот и все будущие запросы должны быть направлены на данный URI.

  • 308 (Постоянный переадресация): запрос и все будущие запросы должны повторяться с использованием другого URI.

Они кажутся похожими.

Ответ 1

Обзор 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 (временное перенаправление).

6.4.3. 302 найдено

Код состояния 302 (Найдено) указывает, что целевой ресурс временно находится под другим URI. Поскольку перенаправление может иногда изменяться, клиент должен продолжать использовать эффективный URI запроса для будущих запросов. [...]

Примечание. По историческим причинам пользовательский агент МОЖЕТ изменить метод запроса с POST на GET для последующего запроса. Если это поведение нежелательно, вместо него можно использовать код состояния 307 (временное перенаправление).

6.4.7. 307 Временный редирект

Код состояния 307 (временное перенаправление) указывает на то, что целевой ресурс временно находится под другим URI, и пользовательский агент НЕ ДОЛЖЕН изменять метод запроса, если он выполняет автоматическое перенаправление на этот URI. Поскольку перенаправление со временем может измениться, клиент должен продолжать использовать исходный эффективный URI запроса для будущих запросов. [...]

Примечание. Этот код состояния аналогичен 302 (найдено), за исключением того, что он не позволяет изменить метод запроса с POST на GET. Эта спецификация не определяет эквивалента для 301 (Постоянно перемещено) (однако RFC 7238 определяет код состояния 308 (Постоянное перенаправление) для этой цели).

Потребность в 308

RFC 7238 был создан для определения кода состояния 308 (перманентное перенаправление), который аналогичен 301 (перманентно перемещен), но не позволяет изменять метод запроса с POST на GET.

Код состояния 308 теперь определяется RFC 7538 (который устарел RFC 7238).

3. 308 постоянный редирект

Код состояния 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       |
+------------------------------------------------------------+-----------+-----------+

Выбор наиболее подходящего кода статуса

Майкл Кропат составил набор диаграмм принятия решений, который помогает определить лучший код состояния для каждой ситуации. См. Следующие коды состояния 2xx и 3xx:

Picking a 2xx or 3xx status code