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

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

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

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

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

Ответ 1

  • 301: постоянная переадресация. Клиенты, выполняющие последующие запросы на этот ресурс, должны использовать новый URI. Клиенты должны не автоматически выполнять перенаправление для запросов POST/PUT/DELETE.
  • 302: перенаправление для причины undefined. Клиенты, выполняющие последующие запросы для этого ресурса, должны использовать не новый URI. Клиенты должны не автоматически выполнять перенаправление для запросов POST/PUT/DELETE.
  • 303: перенаправление для причины undefined. Как правило, "Операция завершена, продолжайте в другом месте". Клиенты, выполняющие последующие запросы для этого ресурса, должны использовать не новый URI. Клиенты должны следовать за перенаправлением для запросов POST/PUT/DELETE, но использовать GET для последующего запроса.
  • 307: временное перенаправление. Ресурс может вернуться в это место позже. Клиенты, выполняющие последующие запросы на этот ресурс, должны использовать старый URI. Клиенты должны не автоматически выполнять перенаправление для запросов POST/PUT/DELETE.

Я лично рекомендую избегать 302, если у вас есть выбор. Многие клиенты не следуют спецификации, когда сталкиваются с 302. Для временных переадресаций вы должны использовать либо 303, либо 307, в зависимости от того, какой тип поведения вы хотите выполнять без запросов GET. Предпочитайте 307-303, если вам не требуется альтернативное поведение в POST/PUT/DELETE.

Ответ 2

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

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

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

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

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

301. Документ перемещается. В будущих запросах должен использоваться новый URL-адрес. Этот URL устарел.

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

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