Разница между HTTP-кодами перенаправления - PullRequest
141 голосов
/ 22 января 2011

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

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

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

Ответы [ 2 ]

126 голосов
/ 22 января 2011
  • 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.

75 голосов
/ 22 января 2011

Разница между 303 и 307 заключается в следующем:

303 : см. Другие.Запрос получен правильно, но результаты должны быть получены с помощью GET по URL перенаправления.

307 : временное перенаправление.Весь запрос должен быть перенаправлен на новый URL.Любые данные поста должны быть повторно опубликованы.

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

Разница между 301 и 303:

301 : документ перемещен.Будущие запросы должны использовать новый URL.Этот URL устарел.

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

303 : запрос полученправильно.Любые запросы PUT обрабатываются.Полученный документ может быть получен из URL перенаправления.Будущий запрос все еще должен идти на исходный URL.

...