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


138

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

  • 301 (Переміщено постійно): Цей та всі майбутні запити повинні бути спрямовані на даний URI.

  • 308 (Постійна перенаправлення): запит і всі майбутні запити слід повторити за допомогою іншого URI.

Вони, схоже, схожі.


Немає коду 308 в tools.ietf.org/html/rfc2616 та tools.ietf.org/html/rfc6585 , тому питання має бути адресоване винахіднику цього нестандартного коду.
КостянтинL

4
Є специфікація RFC 7538, тому це справжній HTTP-код
Олександр Дробышевський,

2
Ну, tools.ietf.org/html/rfc7538 : Примітка. Цей код статусу схожий на 301, за винятком того, що він не дозволяє змінювати метод запиту з POST на GET.
КостянтинL

4
Не використовуйте RFC 2616 в якості посилання. Це було застаріло RFC 7230-35.
кассіомолін

Відповіді:


258

Огляд 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       |
+------------------------------------------------------------+-----------+-----------+

Вибір найбільш підходящого коду статусу

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

Вибір коду стану 2xx або 3xx


3
Зважаючи на те, що питання стосувалося конкретного призначення між 301 та 308, чи можете ви дати ще одне пояснення на тему: "не дозволяє метод запиту змінюватись POSTна GET" ? Чи це означатиме, що дату розміщеної форми неможливо обробити, але нову нову форму можна подати на сервер і потім опублікувати на наступний запит?
Р. Шреурс

1
Цей проект специфікації ( tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html ) передбачає, що сервіси ReSTful повинні використовувати 308 навіть для GET. "Коди перенаправлення HTTP 301-306 НЕ слід використовувати, якщо постачальник послуг не знає, що клієнт насправді є користувальницьким агентом." Однак це лише проект. Я не впевнений, чи / коли це буде прийнято.
Брюс Адамс

1
Ця публікація, остаточне керівництво по прийому-проти-посту , пояснює, чому дозволяють змінитиPOST (безпечний) запит на на (небезпечний у цих даних, передаючи його до URL-адреси - і URL-адреси можна зберегти - включаючи паролі) запит може бути проблемою безпеки, і його взагалі слід уникати, якщо ви не знаєте, що це безпечно для змін. Ці дні здається, що він, як правило, підтримується і вважає за краще використовувати 307, 308 за 301, 302. Але вам слід перевірити. GET
SherylHohman

1
Мнемоніка 308- це як бічна нескінченність, тому Постійне перенаправлення, а також ніколи не змінюватимете метод запиту - це також постійний, фіксований тип запиту. Тоді, 307це 1крок нижче - запит постійного / Keep Method (Get / Post), але редирект на місці TEMP: 7 - виглядає як «лівий поворот» або тимчасовий об'їзд, і 7 також подібна сподіваєтеся до, так що «тримати» метод запиту
SherylHohman

Ви забули згадати Resume Incomplete .
Кну
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.