Разница между HTTP-кодами перенаправления

151

Различия между различными кодами перенаправления HTTP 3XX мне не ясны. Да, я прочитал спецификацию, но здесь есть некоторое расхождение между стандартной и реальной практикой.

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

И 307код перенаправления также кажется ясным: это означает, что перенаправление является временным, и будущие запросы все равно должны использовать исходный URI.

Но я не могу сказать, в чем разница между 302и 303почему они действительно отличаются 301. Кажется, что 302изначально он был предназначен для временного перенаправления (вроде 307), но на практике большинство браузеров рассматривали его как a 303. Но в чем разница между а 303и а 301? Является ли 301должно означать редирект является более постоянным?

Channel72
источник

Ответы:

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 ...)
Джулиан Решке,
1
@JulianReschke Не могли бы вы указать места в спецификации, подтверждающие ваше заявление?
Петр Доброгост
7
@BobAman В вашем описании вы делаете те же ошибки, что и в оригинальной спецификации HTTP ( RFC 1945 ). Например, говоря, что клиенты должны следовать перенаправлению для запросов POST / PUT / DELETE. после перенаправления 303 без указания, что глагол http, который должен использоваться в следующем запросе, должен быть GET, вводит в заблуждение ...
Петр Доброгост
2
Поправляю себя: «Следование 303 требует переписывания метода в GET, если исходный метод не был HEAD».
Джулиан Решке
2
Петр: по умолчанию не следует изменять метод; ресурс перемещен, это не влияет на то, как им манипулировать. 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.

GolezTrol
источник
хороший пост в блоге, в котором подробно рассматриваются 3xx (и все проблемы с ним), находится по адресу: insanecoding.blogspot.no/2014/02/…
arcuri82
@ skeller88 Вы сделали неверный ответ, поэтому я отменил его (спасибо людям, которые приняли изменение)! Вы ввели ту же ошибку, что и принятый ответ. 303 - это другой вид перенаправления, и применяются другие правила, что подтверждается комментариями Джулиана Решке к принятому ответу и блогом, на который ссылался arcuri82
GolezTrol