Різниця між кодами переадресації HTTP


151

Різниці між різними кодами переадресації HTTP 3XX мені незрозумілі. Так, я прочитав специфікацію, але, здається, є певна розбіжність між стандартною та фактичною практикою тут.

Код 301переадресації здається досить зрозумілим: це означає, що ресурс був назавжди переміщений до іншого URI, і майбутні запити повинні використовувати цей URI.

І 307код переспрямування також здається зрозумілим: це означає, що переспрямування є тимчасовим, і майбутні запити все ще повинні використовувати оригінальний URI.

Але я не можу сказати, у чому різниця між 302і 303, або чому будь-який із них насправді відрізняється від 301. Здається, що 302спочатку він мав бути тимчасовим перенаправленням (як 307), але на практиці більшість браузерів трактували це як 303. Але яка різниця між a 303і a 301? Чи 301має означати, що переспрямування є більш постійним?

Відповіді:


139
  • 301 : Постійне переадресація. Клієнти, які подають наступні запити на цей ресурс, повинні використовувати новий URI. Клієнти не повинні автоматично слідувати перенаправленням для запитів POST / PUT / DELETE.
  • 302 : Перенаправлення з невизначеної причини. Клієнти, які подають наступні запити на цей ресурс, не повинні використовувати новий URI. Клієнти не повинні автоматично слідувати перенаправленням для запитів POST / PUT / DELETE.
  • 303 : Перенаправлення з невизначеної причини. Зазвичай "Операція завершена, продовжуйте в іншому місці". Клієнти, які подають наступні запити на цей ресурс, не повинні використовувати новий URI. Клієнти повинні слідувати перенаправленням для запитів POST / PUT / DELETE, але використовувати GET для подальшого запиту .
  • 307 : Тимчасове переадресація. Ресурс може повернутися в це місце пізніше. Клієнти, які подають наступні запити на цей ресурс, повинні використовувати старий URI. Клієнти не повинні автоматично слідувати перенаправленням для запитів POST / PUT / DELETE.

Я особисто рекомендую уникати 302, якщо у вас є вибір. Багато клієнтів не дотримуються специфікації, коли вони стикаються з номером 302. Для тимчасових переадресацій слід використовувати або 303, або 307, залежно від того, який тип поведінки ви хочете на запити, які не є GET. Віддайте перевагу від 307 до 303, якщо вам не потрібна альтернативна поведінка на POST / PUT / DELETE.


26
Ні. Після 303 потрібно переписати метод в GET. Дотримуючись інших, потрібно зберегти метод, але підтвердити за допомогою UA, якщо метод небезпечний (тому інші методи, крім OPTIONS, HEAD, GET, PROPFIND ...)
Julian Reschke

1
@JulianReschke Чи не могли б ви вказати місця у специфікаціях, резервні копії вашої заяви?
Пьотр Доброгост

7
@BobAman У своєму описі ви робите ті самі помилки, які були зроблені в оригінальній специфікації HTTP ( RFC 1945 ). Наприклад, кажучи, що Клієнти повинні слідувати переадресації для запитів POST / PUT / DELETE. після переадресації 303, не вказуючи, що дієслово http, яке слід використовувати у наступному запиті, має бути GET, вводить в оману ...
Пьотр Доброгост

2
Виправляючи себе: "Після 303 потрібно переписати метод в GET, якщо початковий метод не був HEAD".
Джуліан Решке

2
Piotr: за замовчуванням має бути не змінювати метод; ресурс перемістився, що не впливає на те, як ним маніпулювати. 303 - виняток; це не означає, що "ресурс перемістився", але "запит оброблено, і ось ваш результат"; це зовсім інший тип переадресації. Дивіться greenbytes.de/tech/webdav/…
Джуліан Решке

84

Різниця між 303 і 307 полягає в наступному:

303 : Див. Інші. Запит отримано правильно, але результати слід отримати за допомогою GET у URL-адресі переадресації.

307 : Тимчасове переадресація. Весь запит має бути переспрямовано на нову URL-адресу. Будь-які дані публікації повинні бути повторно розміщені.

Зауважте, що 302 повинен був мати поведінку 307, але більшість браузерів реалізували це як поведінку 303 (обидва вони тоді ще не існували). Тому ці два нові коди були введені замість 302.

Різниця між 301 і 303:

301 : Документ переміщено. Майбутні запити повинні використовувати нову URL-адресу. Ця URL-адреса застаріла.

Примітка. Будьте уважні з цим кодом. Браузери та проксі-сервери, як правило, застосовують кеш-кешування на ньому, тому якщо ви відповісте на номер 301, хтось перегляне цю URL-адресу, це може зайняти багато часу.

303 : Запит отримано правильно. Будь-які запити PUT обробляються. Результуючий документ може бути отриманий з URL переадресації. Майбутній запит все ще повинен переходити до оригінальної URL-адреси.


хороша публікація в блозі, яка описується в подробицях 3хх (і всі проблеми з нею) є за адресою: insanecoding.blogspot.no/2014/02/…
arcuri82

@ skeller88 Ви змінили мою відповідь неправильною, тому я її відмінив (бог людям, які прийняли зміну)! Ви ввели ту саму помилку, що і у прийнятій відповіді. 303 - це різного роду переадресація та застосовуються різні правила, що підтверджується коментарями Юліана Решке щодо прийнятої відповіді та блогу, який пов'язував arcuri82
GolezTrol
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.