Примеры 302 против 303

22

В чем разница между ответом 302и 303ответом?

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

  • 10.3.3 302 найдено
  • 10.3.4 303 См. Другое

Являются ли они взаимозаменяемыми или почему один будет использоваться поверх другого? Не могли бы вы предоставить пример использования одного (а другого нет)?

David542
источник

Ответы:

35

Описание на странице, на которую вы ссылались, похоже, довольно точно описывает их назначение:

Переадресация 302 указывает, что перенаправление является временным - клиенты должны проверять исходный URL в будущих запросах.

Перенаправление 303 предназначено для перенаправления POSTзапроса к GETресурсу (в противном случае клиент предполагает, что метод запроса для нового местоположения такой же, как и для исходного ресурса).

Если вы перенаправляете клиента как часть вашего веб-приложения, но ожидаете, что он всегда будет запускаться в веб-приложении (например, с сокращением URL-адреса), перенаправление 302, похоже, имеет смысл. Перенаправление 303 предназначено для использования, когда вы получаете POSTданные от клиента (например, отправка формы), и вы хотите перенаправить их на новую веб-страницу, которая будет использоваться GETвместо POST(например, стандартный запрос страницы).

Но посмотрите на это примечание из определений кода состояния - большинство клиентов делают то же самое для 302 или 303:

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it were a 303
  response, performing a GET on the Location field-value regardless
  of the original request method. The status codes 303 and 307 have
  been added for servers that wish to make unambiguously clear which
  kind of reaction is expected of the client.
larsks
источник
4
Ясно, но неправильно. Перенаправление 303 не является постоянным. RFC заявляет, что «ответ 303 НЕ ДОЛЖЕН кэшироваться» . Описание, которое вы дали здесь, соответствует перенаправлению 301.
Ладададада
2
Моя вина. У меня было 301 и 303 назад. Я обновил ответ.
Жаворонки
сейчас 308
Миранда
Я думаю, что несколько ошибочно полагать, что 303 «предназначен» для перенаправления POST в GET - полная остановка. Спецификация предполагает, что 303 больше о доступности представления ресурса через первоначально запрошенный метод. Если, например, у меня есть большое защищенное изображение, доступное только для аутентифицированных пользователей, я мог бы использовать 303 для перенаправления неаутентифицированных пользователей на меньшее изображение. Метод запроса, используемый в таком случае, не имеет значения.
Боде
В RFC говорится: «Этот метод существует, прежде всего, для того, чтобы выходные данные активированного POST-скрипта могли перенаправить пользовательский агент на выбранный ресурс». и «Ответ на запрос может быть найден под другим URI и ДОЛЖЕН быть получен с использованием метода GET для этого ресурса». Я думаю, что это в значительной степени соответствует тому, что я сказал (все эти много лет назад), но я уверен, что есть место для интерпретации.
Жаворонки
15

Существует четыре различных типа перенаправления (в настоящее время). Первоначально было только два, но большинство клиентов реализовали перенаправление 302 неправильно, поэтому были добавлены еще два, чтобы прояснить разницу между двумя различными вариантами поведения при получении 302.

RFC, на который вы ссылаетесь, утверждает это в разделе о перенаправлениях 302:

  Note: RFC 1945 and RFC 2068 specify that the client is not allowed
  to change the method on the redirected request.  However, most
  existing user agent implementations treat 302 as if it were a 303
  response, performing a GET on the Location field-value regardless
  of the original request method. The status codes 303 and 307 have
  been added for servers that wish to make unambiguously clear which
  kind of reaction is expected of the client.
  1. Перенаправление 301 - это постоянное перенаправление. Он кэшируется, и любые закладки для этого URL должны быть обновлены, чтобы указывать на новый URL.
  2. Перенаправление 302 - это временное перенаправление. По умолчанию он не кэшируется и должен каждый раз запрашиваться повторно (но вы можете переопределить это с помощью заголовков кэширования). В последующем запросе должен использоваться тот же метод (POST, GET, CONNECT, PUT, DELETE и т. Д.), Что и в исходном запросе, и для всего, кроме запросов GET и HEAD, клиент должен запросить пользователя перед выполнением запроса. Это та часть, в которой клиенты ошиблись, и большинство из них изменяют метод для последующего запроса на GET, независимо от исходного метода.
  3. Перенаправление 303 аналогично 302, за исключением того, что последующий запрос теперь явно заменен на запрос GET, и подтверждение не требуется.
  4. Переадресация 307 такая же, как 302, за исключением того, что последующий запрос теперь явно совпадает с исходным запросом, и у пользователя должно быть получено подтверждение для методов запроса, отличных от GET и HEAD.

Старые клиенты могут не понимать перенаправление 303. Все, что делает запрос HTTP / 1.1, должно понимать ответ 303.

Можно считать 300 и 305 ответов перенаправлениями, что означает, что существует шесть различных типов.

Ladadadada
источник
0

Используемые типы перенаправления (301,302,303 ...) оказывают большое влияние на то, как поисковые системы будут индексировать и ранжировать контент. Некоторые пауки могут даже отказаться индексировать временно перенаправленный контент. Подробности можно найти в различной литературе SEO ...

rackandboneman
источник