Rückleitung als Antwort auf XHR-Anfrage

Antworten:

216

Was passiert, wenn der Browser eine Umleitungsantwort auf eine Ajax-Anfrage erhält?

Wenn der Server eine Umleitung sendet (auch bekannt als 302-Antwort plus Location: -Header), folgt die Weiterleitung automatisch vom Browser. Die Antwort auf die zweite Anforderung (vorausgesetzt, es handelt sich auch nicht um eine weitere Umleitung) ist das, was Ihrem Programm angezeigt wird.

Tatsächlich können Sie nicht erkennen, ob eine 302-Antwort aufgetreten ist. Wenn die 302-Umleitung zu einer 200 führt, verhält sich Ihr Programm genauso, als ob die ursprüngliche Anforderung direkt zu einer 200 geführt hätte.

Dies war sowohl meine Erfahrung als auch das in der Spezifikation angegebene Verhalten .

Update 2016: Die Zeit ist vergangen, und die gute Nachricht ist, dass die neue fetch () - API eine genauere Kontrolle darüber bietet, wie Weiterleitungen behandelt werden , wobei das Standardverhalten XHR ähnelt. Das heißt, es funktioniert nur, wenn fetch () nativ implementiert ist . Polyfill-Versionen von fetch () , die auf XHR basieren, unterliegen weiterhin den Einschränkungen von XHR . Glücklicherweise scheint die native Browserunterstützung gut abzurunden.

greim
quelle
47
Interessanterweise bin ich dazu gekommen, weil ich eine Situation habe, in der die Weiterleitung anscheinend nicht befolgt wird. Dies geschieht, wenn die Weiterleitung gegen dieselbe Ursprungsrichtlinie verstößt.
Gus
4
@ Gus, was wahrscheinlich logisch ist
Dmitry
1
Im Falle einer Umleitung zu einem 401 (oder eines 4xx- oder 5xx-Fehlers) würde ich annehmen, dass sich Ihr Programm so verhält, als würde die Anforderung direkt zu einem 401 führen. Sehen Sie das nicht?
Greim
2
Eine RESTful-API kann nach einer POST-Anforderung 201 und einen Standortheader senden. Siehe restapitutorial.com/lessons/httpmethods.html .
1
Update 2019: Fetch funktioniert nicht so, wie wir es vor 3 Jahren erwartet hatten):
lcjury
7

Die ajax-requestwerden dieser Weiterleitung afaik folgen. Der eigentliche Inhalt ( .responseText, .responseXML) ist der Inhalt der Seite, auf die Sie umgeleitet werden.

Möglicherweise können Sie die Umleitung ( status-code, location-header) auf readyState2 oder 3 abfangen , sind sich aber nicht sicher.

Jishi
quelle
Nein, alle diese Staaten haben genau den gleichen Status. Sogar der Wert von getAllResponseHeaders()ist gleich.
Sebastianwagner