Jaka jest różnica między kodami stanu HTTP 301 i 308?

139

Jaka jest różnica między kodami HTTP 301a 308kodami stanu?

  • 301 (Przeniesione na stałe): To i wszystkie przyszłe żądania powinny być kierowane do podanego URI.

  • 308 (Permanent Redirect): Żądanie i wszystkie przyszłe żądania należy powtórzyć przy użyciu innego identyfikatora URI.

Wydają się być podobni.

Alexander Drobyshevsky
źródło
Brak kodu 308 w tools.ietf.org/html/rfc2616 i tools.ietf.org/html/rfc6585 , więc pytanie należy skierować do twórcy tego niestandardowego kodu.
KonstantinL
4
Istnieje specyfikacja RFC 7538, więc jest to rzeczywisty kod HTTP
Alexander Drobyshevsky
2
Cóż, tools.ietf.org/html/rfc7538 : Uwaga: ten kod statusu jest podobny do 301, z tym wyjątkiem, że nie pozwala na zmianę metody żądania z POST na GET.
KonstantinL
4
Nie używaj RFC 2616 jako odniesienia. Został przestarzały przez RFCs 7230-35.
kasiomolina

Odpowiedzi:

259

Przegląd 301, 302i307

RFC 7231 , prąd odniesienia semantyki i zawartości HTTP / 1.1, definiuje 301(przeniesiony na stałe) i 302(stwierdzono) kod stanu, który umożliwia sposób żądanie być zmieniane POSTw celu GET. Ta specyfikacja definiuje również 307kod stanu (Przekierowanie tymczasowe), który nie pozwala na zmianę metody żądania z POSTna GET.

Zobacz więcej szczegółów poniżej:

6.4.2. 301 wyprowadził się permamentnie

Kod stanu 301(Przeniesiony na stałe) wskazuje, że do zasobu docelowego został przypisany nowy stały identyfikator URI, a wszelkie przyszłe odwołania do tego zasobu powinny używać jednego z dołączonych identyfikatorów URI. […]

Uwaga: Ze względów historycznych agent użytkownika MOŻE zmienić metodę żądania z POSTna GETdla kolejnego żądania. Jeśli to zachowanie jest niepożądane, 307można zamiast tego użyć kodu stanu (Przekierowanie tymczasowe).

6.4.3. 302 Znaleziono

302(Found) kod stanu wskazuje, że zasób docelowy przebywa tymczasowo pod innym URI. Ponieważ przekierowanie może być czasami zmieniane, klient powinien nadal używać skutecznego identyfikatora URI żądania dla przyszłych żądań. […]

Uwaga: Ze względów historycznych agent użytkownika MOŻE zmienić metodę żądania z POSTna GETdla kolejnego żądania. Jeśli to zachowanie jest niepożądane, 307można zamiast tego użyć kodu stanu (Przekierowanie tymczasowe).

6.4.7. 307 Tymczasowe przekierowanie

Kod stanu 307(Przekierowanie tymczasowe) wskazuje, że zasób docelowy znajduje się tymczasowo pod innym identyfikatorem URI, a agent użytkownika NIE MOŻE zmieniać metody żądania, jeśli wykonuje automatyczne przekierowanie do tego identyfikatora URI. Ponieważ przekierowanie może się zmieniać w czasie, klient powinien nadal używać oryginalnego skutecznego identyfikatora URI żądania dla przyszłych żądań. […]

Uwaga: ten kod stanu jest podobny do 302(Znaleziono), z tą różnicą, że nie pozwala na zmianę metody żądania z POSTna GET. Ta specyfikacja nie definiuje równoważnego odpowiednika dla 301(Przeniesiono na stałe) ( RFC 7238 definiuje jednak 308 w tym celu kod statusu (Permanent Redirect)).

Potrzeba 308

Dokument RFC 7238 został utworzony w celu zdefiniowania 308kodu stanu (Permanent Redirect), który jest podobny do 301(Moved Permanently), ale nie pozwala na zmianę metody żądania z POSTna GET.

308Kod stanu jest teraz zdefiniowany przez RFC 7538 (który zastąpiony w RFC 7238 ).

3. 308 Stałe przekierowanie

Kod stanu 308(Permanent Redirect) wskazuje, że do zasobu docelowego został przypisany nowy stały identyfikator URI, a wszelkie przyszłe odwołania do tego zasobu powinny używać jednego z dołączonych identyfikatorów URI. Klienci z możliwością edycji linków powinni automatycznie ponownie łączyć odniesienia do efektywnego identyfikatora URI żądania z jednym lub większą liczbą nowych odniesień wysłanych przez serwer, jeśli to możliwe. […]

Uwaga: ten kod stanu jest podobny do 301(Przeniesiono na stałe), z tą różnicą, że nie pozwala na zmianę metody żądania z POSTna GET.

Oto mamy:

                                                             +-----------+-----------+
                                                             | Permanent | Temporary |
+------------------------------------------------------------+-----------+-----------+
| Allows changing the request method from POST to GET        | 301       | 302       |
+------------------------------------------------------------+-----------+-----------+
| Doesn't allow changing the request method from POST to GET | 308       | 307       |
+------------------------------------------------------------+-----------+-----------+

Wybór najbardziej odpowiedniego kodu statusu

Michael Kropat przygotował zestaw wykresów decyzyjnych, które pomagają określić najlepszy kod statusu dla każdej sytuacji. Zobacz następujące informacje 2xxi 3xxkody stanu:

Wybieranie kodu stanu 2xx lub 3xx

kasiomolina
źródło
3
Biorąc pod uwagę, że pytanie dotyczyło konkretnie miejsca docelowego między 301 a 308, czy mógłbyś podać więcej wyjaśnień na temat: „nie pozwala na zmianę metody żądania z POSTna GET ? Czy oznaczałoby to, że wysłany formularz nie może zostać przetworzony, ale nowy nowy formularz mógłby zostać wysłany na serwer, a następnie wysłany na następne żądanie?
R. Schreurs
1
Ta szkicowa specyfikacja ( tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html ) sugeruje, że usługi ReSTful powinny używać 308 nawet dla GET. „Kody przekierowania HTTP 301-306 NIE POWINNY być używane, chyba że usługodawca wie, że klient jest w rzeczywistości agentem użytkownika”. Jednak to tylko szkic. Nie jestem pewien, czy / kiedy zostanie zaakceptowany.
Bruce Adams
1
Ten post, ostateczny przewodnik po tym, jak dostać się w porównaniu z postem , wyjaśnia, dlaczego zezwalanie POST(bezpieczne) na zmianę żądania na a do GET(niebezpieczne w tych danych jest przekazywane przez dodanie ich do adresu URL - a adresy URL można zapisać - w tym hasła) może stanowić problem z bezpieczeństwem i generalnie należy go unikać, chyba że wiesz, że zmiana jest bezpieczna. Obecnie wydaje się, że jest ogólnie obsługiwany i preferowany jest 307, 308 zamiast 301, 302. Ale powinieneś to sprawdzić.
SherylHohman
1
Mnemonic 308jest jak boczna nieskończoność, więc stałe przekierowanie, a także nigdy nie zmienia metody żądania - jest to również stały, ustalony typ żądania. Następnie 307jest 1krok poniżej - metoda trwałego / utrzymywania żądania (Get / Post), ale przekierowanie do tymczasowej lokalizacji: 7 - wygląda jak „skręt w lewo” lub tymczasowy objazd, a 7 jest również podobny do k, więc „zachowaj” metoda żądania.
SherylHohman
Zapomniałeś wspomnieć o niekompletnym wznowieniu .
Knu