Verhindern Sie die Umleitung von Xmlhttprequest

112

Ist es möglich zu verhindern, dass der Browser beim Senden von XMLHttpRequest-s Weiterleitungen folgt (dh den Weiterleitungsstatuscode zurückerhält und selbst bearbeitet)?

Zim
quelle

Antworten:

102

Nicht gemäß dem W3C-Standard für das XMLHttpRequest-Objekt (Hervorhebung hinzugefügt):

Wenn die Antwort eine HTTP-Umleitung ist:

Wenn der Ursprung der vom Location-Header übermittelten URL mit dem XMLHttpRequest-Ursprung identisch ist und die Umleitung nicht gegen die Vorsichtsmaßnahmen für Endlosschleifen verstößt, befolgen Sie die Umleitung transparent, während Sie die Anforderungsereignisregeln für denselben Ursprung beachten.

Sie überlegten es für eine zukünftige Veröffentlichung:

Diese Spezifikation enthält nicht die folgenden Funktionen, die für eine zukünftige Version dieser Spezifikation in Betracht gezogen werden:

  • Eigenschaft zum Deaktivieren nach Weiterleitungen;

In der neuesten Spezifikation wird dies jedoch nicht mehr erwähnt.

Junge Baukema
quelle
5
Was lächerlich ist, ist, wenn die transparente Umleitung das Überschreiben einiger HTTP-Header beinhaltet, die in der ursprünglichen Anforderung festgelegt wurden. Insbesondere wenn der Header "Akzeptieren" auf einen bestimmten Inhaltstyp festgelegt wurde, schließt Firefox diesen Header nicht ein, wenn er der Umleitung folgt (was es etwas schwieriger macht, vollständig REST-basierte Webdienste zu entwickeln, die diesen Header verwenden ... murren).
Ruquay
1
Einige weitere Suchanfragen
ruquay
2
Stimmen Sie zu, total rediculus Designfehler.
Rasive
35

Die neue API Fetch unterstützt verschiedene Arten der Umleitung Handhabung: follow, errorund manual, aber ich kann nicht einen Weg finden , die neue URL oder den Statuscode anzuzeigen , wenn die Umleitung abgebrochen wurde. Sie können die Umleitung selbst einfach stoppen, und dann sieht es aus wie ein Fehler (leere Antwort). Wenn das alles ist, was Sie brauchen, können Sie loslegen. Auch sollte man sich bewusst sein , dass die über diese API gestellten Anträge nicht stornierbar sind noch . Sie sind jetzt.

Bei XMLHttpRequest können Sie HEADden Server überprüfen, ob sich die URL geändert hat:

var http = new XMLHttpRequest();
http.open('HEAD', '/the/url');
http.onreadystatechange = function() {
    if (this.readyState === this.DONE) {
        console.log(this.responseURL);
    }
};
http.send();

Sie erhalten den Statuscode nicht, finden jedoch die neue URL, ohne die gesamte Seite von dort herunterzuladen.

Benutzer
quelle
Manchmal ist die Verwendung OPTIONSdie bessere Wahl, funktioniert jedoch nur für nicht allgemeine Zwecke usw. Der Administrator hat die Umleitung der gesamten Site / des gesamten Schemas konfiguriert, z. B. HTTP -> HTTPS
William Leung
12

Sie können die responseURLEigenschaft verwenden, um das Umleitungsziel abzurufen oder zu überprüfen, ob die Antwort letztendlich von einem von Ihnen akzeptierten Speicherort abgerufen wurde.
Dies bedeutet natürlich, dass das Ergebnis trotzdem abgerufen wird, aber zumindest können Sie die erforderlichen Informationen über das Umleitungsziel abrufen und beispielsweise Bedingungen erkennen, unter denen Sie die Antwort verwerfen möchten.

Roland Pihlakas
quelle
11

Nein, es gibt keinen Platz in der API, der von XMLHttpRequest verfügbar gemacht wird, mit dem Sie das Standardverhalten überschreiben können, einem 301 oder 302 automatisch zu folgen.

Wenn auf dem Client IE unter Windows ausgeführt wird, können Sie stattdessen WinHTTP verwenden, um eine Option festzulegen, um dieses Verhalten zu verhindern. Dies ist jedoch eine sehr einschränkende Lösung.

AnthonyWJones
quelle