Wracając przekierowanie jako odpowiedź na żądanie XHR

Odpowiedzi:

216

Co się stanie, jeśli przeglądarka otrzyma odpowiedź przekierowania na żądanie AJAX?

Jeśli serwer wyśle ​​przekierowanie (inaczej odpowiedź 302 plus nagłówek Location:), przeglądarka automatycznie śledzi przekierowanie. Odpowiedź na drugie żądanie (zakładając, że nie jest to również kolejne przekierowanie) jest tym, co jest widoczne dla twojego programu.

W rzeczywistości nie masz możliwości wykrycia, czy wystąpiła odpowiedź 302. Jeśli przekierowanie 302 prowadzi do 200, program działa tak samo, jakby pierwotne żądanie prowadziło bezpośrednio do 200.

To było zarówno moje doświadczenie, jak i zachowanie określone w specyfikacji .

Aktualizacja 2016: Czas minął i dobrą wiadomością jest to, że nowe API fetch () ma oferować bardziej szczegółową kontrolę nad tym, jak obsługiwane są przekierowania , z domyślnym zachowaniem podobnym do XHR. To powiedziawszy, działa tylko wtedy, gdy funkcja fetch () jest implementowana natywnie . Wersje funkcji fetch () z funkcją wielokrotnego wypełniania - które są oparte na XHR - nadal mają ograniczenia XHR . Na szczęście natywna obsługa przeglądarek wydaje się ładnie dopełniać.

Greim
źródło
47
Co ciekawe, doszedłem do tego, ponieważ doświadczam sytuacji, w której przekierowanie najwyraźniej nie jest śledzone ... dzieje się tak, gdy przekierowanie narusza tę samą politykę pochodzenia.
Gus
4
@Gus, co jest prawdopodobnie logiczne
Dmitry
1
W przypadku przekierowania do błędu 401 (lub dowolnego błędu 4xx lub 5xx) zakładam, że Twój program będzie zachowywał się tak, jakby żądanie prowadziło bezpośrednio do 401. Czy to nie to, co widzisz?
greim
2
RESTful API może wysłać 201 i nagłówek lokalizacji po żądaniu POST; zobacz restapitutorial.com/lessons/httpmethods.html .
1
Aktualizacja 2019: pobieranie nie działa tak, jak się spodziewaliśmy 3 lata temu):
lcjury
7

ajax-requestPójdą przekierowujące AFAIK. Rzeczywista zawartość ( .responseText, .responseXML) będzie treścią ze strony, na którą nastąpi przekierowanie.

Możesz być w stanie przechwycić przekierowanie ( status-code, location-header) na readyState2 lub 3, ale nie masz co do tego pewności.

jishi
źródło
Nie, wszystkie te stany mają dokładnie ten sam status. Nawet wartość getAllResponseHeaders()jest równa.
sebastianwagner