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

139

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

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

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

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

Александр Дробышевский
источник
Код 308 отсутствует в файлах tools.ietf.org/html/rfc2616 и tools.ietf.org/html/rfc6585 , поэтому вопрос следует адресовать изобретателю этого нестандартного кода.
KonstantinL
4
Есть спецификация RFC 7538, значит, это настоящий HTTP-код
Александр Дробышевский
2
Что ж, tools.ietf.org/html/rfc7538 : Примечание. Этот код состояния аналогичен 301, за исключением того, что он не позволяет изменять метод запроса с POST на GET.
KonstantinL
4
Не используйте RFC 2616 как ссылку. Он был устарел RFC 7230-35.
кассиомолин

Ответы:

260

Обзор 301, 302и307

RFC 7231 , текущая ссылка для семантики и содержания / 1.1 протокола HTTP, определяет 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(Permanent Redirect) код статуса, который похож на 301(перемещено) , но не позволяет метод запроса будет изменен с POSTк GET.

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

3. 308 постоянное перенаправление

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

Примечание. Этот код состояния аналогичен 301(Перемещен навсегда), за исключением того, что он не позволяет изменять метод запроса с POSTна GET.

Итак, мы имеем следующее:

                                                             +-----------+-----------+
                                                             | 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       |
+------------------------------------------------------------+-----------+-----------+

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

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

Выбор кода состояния 2xx или 3xx

cassiomolin
источник
3
Учитывая, что вопрос был конкретно о назначении между 301 и 308, не могли бы вы дать дополнительные пояснения по поводуPOSTGET : «не позволяет изменить метод запроса с на » ? Означает ли это, что опубликованная форма не может быть обработана, но новая новая форма может быть отправлена ​​на сервер, а затем отправлена ​​по следующему запросу?
R. Schreurs
1
Этот черновой вариант спецификации ( tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html ) предполагает, что службы ReSTful должны использовать 308 даже для GET. «Коды перенаправления HTTP 301-306 НЕ ДОЛЖНЫ использоваться, если поставщик услуг не знает, что клиент на самом деле является агентом пользователя». Однако это только черновик. Я не уверен, когда оно будет принято.
Брюс Адамс
1
В этом посте, the-Definitive-guide-to-get-vs-post , разъясняется, почему разрешение POST(безопасного) запроса быть измененным на GET(небезопасно в том случае, если данные передаются путем добавления их к URL-адресу), и URL-адреса могут быть сохранены - включая пароли) может быть проблемой безопасности, и, как правило, его следует избегать, если вы не знаете, что изменение безопасно. В наши дни кажется, что он в целом поддерживается, и предпочитают использовать 307, 308, а не 301, 302. Но вам следует проверить.
SherylHohman
1
Мнемоника 308похожа на боковую бесконечность, поэтому постоянное перенаправление и никогда не изменяют метод запроса - это также постоянный фиксированный тип запроса. Тогда, 307это 1шаг ниже - запрос постоянного / Keep Method (Get / Post), но редирект на месте TEMP: 7 - выглядит как «левый поворот» или временный объезд, и 7 также сходна надеетесь к, так что «держать» метод запроса.
Шерил Хохман
Вы забыли упомянуть « Неполное резюме» .
Knu,