2013-07-12 8 views
12

Jakie zachowanie oczekuje się po przekierowaniu POST => 302 do GET?Jakie zachowanie oczekujesz od przekierowania HTTP POST => 302 do GET?

W chrome (i prawdopodobnie najbardziej każdej przeglądarce), po I POST (do zasobu, który chce, żebym przekierował) i otrzymuję przekierowanie 302, przeglądarka automatycznie wydaje GET w 302 lokalizacji. Jest to nawet well known pattern. Ale sposób, w jaki czytam specyfikację, zdaje się sugerować, że tak się nie stanie.

The HTTP spec says

Jeśli pojawi się kod 302 stanu w odpowiedzi na wniosek innego niż GET lub HEAD, agent użytkownika NIE automatycznie przekierować wniosek chyba może być potwierdzona przez użytkownik, ponieważ może to zmienić warunki, w których żądanie zostało wysłane.

A Skrzypek pokazuje: powyżej

REQUEST 1: POST URLA 
RESPONSE 1: 302 redirect to URLB 
REQUEST 2: GET URLB 

Sekcja zdaje się mówić, że przeglądarka nie powinno sprawić, że żądania GET? czego mi brakuje?

  1. Coś wcześniej w specyfikacji, które sprawia, że ​​ten odcinek nieistotnych
  2. moje rozumienie automatycznie przekierować jest źle (a przeglądarka chrom, że zrobił to naprawdę nie GET została automatycznie przekierowanie)
  3. Moje rozumienie potwierdziła jako użytkownik
  4. Coś jeszcze?

Odpowiedz

13

Już następnego wiersza w specyfikacji zaczyna:

Uwaga: RFC 1945 i RFC 2068 określa, że ​​klient nie jest dozwolone zmienić metodę na przekierowanego życzenie. Jednak większość istniejących implementacji agenta użytkownika traktuje 302 tak, jakby była odpowiedzią 303, wykonując GET w polu Wartość-lokalizacji niezależnie od pierwotnej metody żądania. Dodano kody stanu 303 i 307 dla serwerów, które chcą jednoznacznie określić, który rodzaj reakcji jest oczekiwany od klienta.

I zaraz po tym wyjaśnia, w jaki sposób należy obsłużyć 303, i dokładnie to widzimy.


Jeśli pytasz dlaczego serwery są wciąż przy 302 zamiast 307, które wszystkie aktualne przeglądarki będą obsługiwać poprawnie, to dlatego, że stare przeglądarki nie będą obsługiwać go. Jeśli zastanawiasz się, dlaczego przeglądarki obsługują 302 jako 303, to dlatego, że oczekują tego stare serwery. Naprawdę nie ma wyjścia z tej pętli i prawdopodobnie lepiej byłoby, gdyby protokół HTTP po prostu cofnął 302, aby oznaczać to, co miał na myśli, i wycofał (dla non-GET/HEAD) na rzecz 307.

+1

abarnet: proszę wyjaśnić co masz na myśli przez "starych przeglądarek". –

+0

@JulianReschke: Nie wiem dokładnie. Gdybym miał zgadywać, zgaduję, że rocznik jest w okolicach IE6 i FF 1.9. Pamiętaj jednak, że przeglądarki komputerowe (i przeglądarki mobilne WebKit) nie są jedynymi użytkownikami; jest mnóstwo ludzi używających innych urządzeń, które mają w nich przeglądarki, ręcznie kodowane klienty usług internetowych lub narzędzia do skrobania, itp. – abarnert

+0

@JulianReschke: Powinienem też wspomnieć, że 303 i 307 są tylko w HTTP/1.1. Istnieje wiele serwerów i pamięci podręcznych (i niektórych programów użytkownika), które nie mogą obsłużyć wersji 1.1, lub wyłączyć ją. Tymczasem właśnie znalazłem [wpis na blogu] (http://blogs.msdn.com/b/ieinternals/archive/2011/08/19/understanding-the-impact-of-redirect-response-status-codes-on- http-methods-like-head-get-post-and-delete.aspx) z zespołu IE, który wygląda na trafny. – abarnert

0

abarnert miał rację! Miałem ten sam problem z Google App Engine, ale znalazłem inne rozwiązanie.

Mój problem z appengine był, zrobiłem POST z formularzem do GO formHandler w backend. Ale został wykonany w następujący sposób.

wniosek 1: GET/formHandler -> Odpowiedź 1: 302 Znaleziono

wniosek 1: POST/formHandler -> Odpowiedź 1: 302 Znaleziono

wniosek 1: GET/formHandler -> Odpowiedź 1: 200 Ok.

Dodatkowo mam

Nie 'Access-Control-Allow-Origin' header jest obecny na żądanego zasobu

co było problemem CORS.

Jednak rozwiązaniem okazuje się użycie HTTP S zamiast HTTP.

Wtedy masz

prośbę: POST/formHandler -> Odpowiedź: 200 Ok

Powiązane problemy