Różnica między kodami przekierowania HTTP

151

Różnice między różnymi kodami przekierowań HTTP 3XX nie są dla mnie jasne. Tak, przeczytałem specyfikację, ale wydaje się, że istnieje pewna rozbieżność między standardem a rzeczywistą praktyką.

301Kod przekierowanie wydaje się wystarczająco jasne: To oznacza, że zasób został na stałe przeniesiony do innego URI, a przyszłe wnioski powinny wykorzystywać że URI.

A 307kod przekierowanie również wydaje się jasne: to oznacza, że przekierowanie jest tymczasowy i przyszłe wnioski powinny nadal korzystać z oryginalnego URI.

Ale nie mogę powiedzieć, jaka jest różnica między 302i 303ani dlaczego którekolwiek z nich są naprawdę różne 301. Wygląda na to, że 302pierwotnie miało to być tymczasowe przekierowanie (np. 307), Ale w praktyce większość przeglądarek traktowała to jak 303. Ale jaka jest różnica między a 303i a 301? Czy 301ma to oznaczać, że przekierowanie jest bardziej trwałe?

Channel72
źródło

Odpowiedzi:

139
  • 301 : Trwałe przekierowanie. Klienci wysyłający kolejne żądania dotyczące tego zasobu powinni używać nowego identyfikatora URI. Klienci nie powinni automatycznie podążać za przekierowaniem dla żądań POST / PUT / DELETE.
  • 302 : Przekierowanie z nieokreślonego powodu. Klienci wysyłający kolejne żądania dotyczące tego zasobu nie powinni używać nowego identyfikatora URI. Klienci nie powinni automatycznie podążać za przekierowaniem dla żądań POST / PUT / DELETE.
  • 303 : Przekierowanie z nieokreślonego powodu. Zwykle „Operacja została zakończona, kontynuuj w innym miejscu”. Klienci wysyłający kolejne żądania dotyczące tego zasobu nie powinni używać nowego identyfikatora URI. Klienci powinni postępować zgodnie z przekierowaniem dla żądań POST / PUT / DELETE, ale użyć GET dla żądania uzupełniającego .
  • 307 : Tymczasowe przekierowanie. Zasób może wrócić do tej lokalizacji w późniejszym czasie. Klienci wysyłający kolejne żądania dotyczące tego zasobu powinni używać starego identyfikatora URI. Klienci nie powinni automatycznie podążać za przekierowaniem dla żądań POST / PUT / DELETE.

Osobiście zalecam unikanie 302, jeśli masz wybór. Wielu klientów nie postępuje zgodnie ze specyfikacją, gdy napotkają 302. W przypadku tymczasowych przekierowań należy użyć 303 lub 307, w zależności od tego, jakiego typu zachowania chcesz używać w przypadku żądań innych niż GET. Preferuj 307 do 303, chyba że potrzebujesz alternatywnego zachowania na POST / PUT / DELETE.

Bob Aman
źródło
26
Nie. Po 303 wymaga przepisania metody na GET. Podążanie za innymi wymaga zachowania metody, ale potwierdzenie w UA, jeśli metoda jest niebezpieczna (więc metody inne niż OPTIONS, HEAD, GET, PROPFIND ...)
Julian Reschke
1
@JulianReschke Czy mógłbyś wskazać miejsca w specyfikacjach, które potwierdzają Twoje oświadczenie?
Piotr Dobrogost
7
@BobAman W swoim opisie robisz te same błędy, co w oryginalnej specyfikacji HTTP ( RFC 1945 ). Na przykład mówiąc, że klienci powinni postępować zgodnie z przekierowaniem dla żądań POST / PUT / DELETE. po 303 przekierowanie bez określania, że http czasownik do użytku w następujący wniosek musi być GET jest mylące ...
Piotr Dobrogost
2
Korygowanie siebie: „Podążanie za 303 wymaga przepisania metody na GET, chyba że metoda początkowa to HEAD”.
Julian Reschke
2
Piotr: domyślnie nie należy modyfikować metody; zasób został przeniesiony, nie ma to wpływu na sposób manipulowania nim. 303 jest wyjątkiem; nie oznacza to „zasób został przeniesiony”, ale „żądanie zostało przetworzone, a oto wynik”; to zupełnie inny rodzaj przekierowania. Zobacz greenbytes.de/tech/webdav/…
Julian Reschke
84

Różnica między 303 a 307 jest następująca:

303 : Zobacz inne. Żądanie zostało odebrane poprawnie, ale wyniki należy pobrać za pomocą polecenia GET na adresie URL przekierowania.

307 : Tymczasowe przekierowanie. Całe żądanie powinno zostać przekierowane do nowego adresu URL. Wszelkie dane postów należy ponownie opublikować.

Zauważ, że 302 miało mieć zachowanie 307, ale większość przeglądarek zaimplementowało to jako zachowanie 303 (obie wtedy nie istniały). Dlatego te dwa nowe kody zostały wprowadzone w celu zastąpienia 302.

Różnica między 301 a 303:

301 : Dokument został przeniesiony. Przyszłe żądania powinny używać nowego adresu URL. Ten adres URL jest nieaktualny.

Uwaga: uważaj na ten kod. Przeglądarki i serwery proxy mają tendencję do stosowania bardzo agresywnego buforowania, więc jeśli odpowiesz za pomocą 301, ponowne odwiedzenie tego adresu URL może zająć dużo czasu.

303 : Żądanie zostało odebrane poprawnie. Wszelkie żądania PUT są przetwarzane. Otrzymany dokument można pobrać z adresu URL przekierowania. Przyszłe żądanie powinno nadal trafiać do pierwotnego adresu URL.

GolezTrol
źródło
dobry post na blogu, który omawia
arcuri82
@ skeller88 Twoja zmiana spowodowała, że ​​moja odpowiedź była nieprawidłowa, więc ją cofnąłem (boo do ludzi, którzy zaakceptowali zmianę)! Wprowadziłeś ten sam błąd, co zaakceptowana odpowiedź. 303 to inny rodzaj przekierowania i obowiązują inne zasady, co potwierdzają komentarze Juliana Reschke do zaakceptowanej odpowiedzi oraz blog, do którego linkował arcuri82
GolezTrol