Przykłady 302 vs 303

22

Jaka jest różnica między a 302a 303odpowiedzią?

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

  • 10.3.3 302 Znaleziono
  • 10.3.4 303 Patrz inne

Czy są one wymienne lub dlaczego jeden z nich miałby być używany? Czy możesz podać przypadek użycia jednego z nich (a drugiego nie)?

David542
źródło

Odpowiedzi:

35

Opis na stronie, do której prowadziłeś link, wydaje się dość opisowy dla jego zamierzonego celu:

Przekierowanie 302 wskazuje, że przekierowanie jest tymczasowe - klienci powinni sprawdzać oryginalny adres URL w przyszłych żądaniach.

Przekierowanie 303 ma na celu przekierowanie POSTżądania do GETzasobu (w przeciwnym razie klient zakłada, że ​​metoda żądania dla nowej lokalizacji jest taka sama jak dla oryginalnego zasobu).

Jeśli przekierowujesz klienta jako część aplikacji internetowej, ale oczekujesz, że zawsze zacznie się od aplikacji internetowej (na przykład skracacza URL), przekierowanie 302 wydaje się mieć sens. Przekierowanie 303 jest używane, gdy otrzymujesz POSTdane od klienta (np. Przesłanie formularza) i chcesz przekierować je na nową stronę internetową, którą chcesz pobrać GETzamiast POST(np. Standardowe żądanie strony).

Ale zobacz tę notatkę z definicji kodów stanu - większość klientów zrobi to samo dla 302 lub 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
źródło
4
Jasne, ale złe. Przekierowanie 303 nie jest trwałe. RFC stwierdza „NIE MOŻNA buforować odpowiedzi 303” . Podany tutaj opis odpowiada przekierowaniu 301.
Ladadadada
2
Mea culpa. Miałem 301 i 303 do tyłu. Zaktualizowałem odpowiedź.
larsks
jest teraz 308
Miranda
Myślę, że nieco mylące jest sugerowanie, że 303 jest „przeznaczone” do przekierowania testu POST na GET - kropka. Specyfikacja sugeruje, że 303 bardziej dotyczy dostępności reprezentacji zasobu za pomocą pierwotnie żądanej metody. Jeśli na przykład mam duży obraz chroniony prawami, dostępny tylko dla uwierzytelnionych użytkowników, mogę użyć numeru 303, aby przekierować nieuwierzytelnionych użytkowników do mniejszego obrazu. Metoda żądania zastosowana w takim przypadku jest nieistotna.
beaudet
RFC mówi: „Ta metoda istnieje przede wszystkim po to, aby umożliwić wyjściu skryptu aktywowanego przez POST przekierowanie klienta użytkownika do wybranego zasobu”. oraz „Odpowiedź na żądanie można znaleźć pod innym identyfikatorem URI i POWINNA zostać pobrana przy użyciu metody GET dla tego zasobu”. Myślę, że prawie pasuje do tego, co powiedziałem (wszystkie lata temu), ale jestem pewien, że jest miejsce na interpretację.
larsks
15

Istnieją cztery różne typy przekierowań (obecnie). Początkowo było tylko dwóch, ale większość klientów nieprawidłowo wdrożyła przekierowanie 302, więc dodano dwa kolejne, aby wyjaśnić różnicę między dwoma różnymi możliwymi zachowaniami po otrzymaniu 302.

RFC, z którym się łączyłeś, stwierdza to w sekcji na temat przekierowań 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. Przekierowanie 301 jest przekierowaniem trwałym. Jest buforowalny i wszelkie zakładki dla tego adresu URL powinny zostać zaktualizowane, aby wskazywały nowy adres URL.
  2. Przekierowanie 302 jest przekierowaniem tymczasowym. Domyślnie nie jest buforowalny i powinien być każdorazowo ponownie żądany (ale można to zastąpić buforowaniem nagłówków). W żądaniu uzupełniającym należy użyć tej samej metody (POST, GET, CONNECT, PUT, DELETE itp.), Co w pierwotnym żądaniu, a w przypadku wszelkich elementów innych niż żądania GET i HEAD klient powinien poprosić użytkownika przed wysłaniem żądania. Jest to część, w której klienci się mylili i większość z nich zmienia metodę żądania uzupełniającego na GET, niezależnie od oryginalnej metody.
  3. Przekierowanie 303 jest takie samo jak przekierowanie 302, z tą różnicą, że żądanie uzupełniające zostało teraz jawnie zmienione na żądanie GET i nie jest wymagane potwierdzenie.
  4. Przekierowanie 307 jest takie samo jak 302, z tym wyjątkiem, że żądanie uzupełniające jest teraz wyraźnie takie samo jak pierwotne żądanie i użytkownik musi uzyskać potwierdzenie dla metod żądania innych niż GET i HEAD.

Starsi klienci mogą nie rozumieć przekierowania 303. Wszystko, co powoduje żądanie HTTP / 1.1, powinno zrozumieć odpowiedź 303.

Możliwe jest rozważenie 300 i 305 odpowiedzi jako przekierowań, co oznacza, że ​​istnieje sześć różnych typów.

Ladadadada
źródło
0

Zastosowane typy przekierowań (301,302,303 ...) mają duży wpływ na to, jak wyszukiwarki będą indeksować i klasyfikować zawartość. Niektóre pająki mogą nawet odmówić indeksowania tymczasowo przekierowanych treści. Szczegóły można znaleźć w różnych literaturach SEO ...

rackandboneman
źródło