2010-09-29 4 views
21

Ist es möglich, eine xhr-HTTP-HEAD-Anfrage zu senden, um nur Header-Response für die erste Anfrage zu bekommen und 301, 302 nicht wie Redirects zu folgen? Ich bin nur daran interessiert, den neuen Standort der URL zu erhalten. Beispiel:Ist es möglich, dass XHR HEAD-Anfragen den Weiterleitungen nicht folgen (301 302)

var xhr = new XMLHttpRequest(); 
xhr.onreadystatechange = function(data) { 
    if (xhr.readyState == 4) { 
     if (xhr.status == 301 || xhr.status == 302) { 
      // Get new location url don't GET it 
     } 
    } 
}; 
xhr.open('HEAD', url, true); 
xhr.send(); 

http://www.w3.org/TR/XMLHttpRequest/#infrastructure-for-the-send-method scheint fest, dass Anforderungen befolgt werden sollen, gibt es eine Möglichkeit, dies zu stoppen?

+0

Mögliches Duplikat [Prevent Umleitung von XMLHttpRequest] (http: // Stackoverflow .com/questions/228225/prevent-redirection-of-xmlhttprequest) – user

Antwort

16

Es gibt kein ungeschütztes Verhalten, das Sie stoppen können.

Es ist wegen the spec you linked already, das angegebene Verhalten ist, dass XmlHttpRequest sollte transparent folgen Umleitungen ... unter der Decke leider und nicht in einer Weise, die Sie verhindern können.

Es ist so zu versuchen, die Dinge einfacher zu machen, wenn Ressourcen bewegen, etc ... aber wenn es entworfen und die Spezifikation ausgelegt war, waren alle diese Umleitung Dienste nicht da draußen. Es gab einfach keinen starken Bedarf für anderes Verhalten oder die Fähigkeit, es zu verhindern. Ich denke, mit so vielen Weiterleitungen, die das Web erreichen, werden wir nicht die Möglichkeit sehen, aber wer weiß, wann jeder Browser es unterstützen würde.

+0

Hallo Nick, danke für unsere Antwort, das hat mir geholfen. Ich würde jedoch gerne wissen, ob es eine Möglichkeit gibt, die finale URL zu finden, auf die die Umleitung (en) zeigen? – ehretf

+0

Hallo @ Nick-Craver und Antonj, ich denke, stoppen Sie die Umleitung ist möglich. Bitte überprüfe meine Antwort unten und versuche meinen Code. Vielen Dank. – Alix

6

Die W3C-Spezifikation erfordert, dass Umleitungen automatisch gefolgt werden, wie @Nick suggested in the other answer. Doch eine Eigenschaft Umleitungen deaktivieren wird considered by the W3C for a future version of this specification:

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

  • Ladeereignis und onload Attribut;
  • Fehlerereignis und Onerror-Attribut;
  • Fortschrittsereignis und Onprogress-Attribut;
  • Ereignis abbrechen und Attribut onabort abbrechen;
  • Timer wurden vorgeschlagen, vielleicht ein Ontimeout-Attribut;
  • Eigenschaft zum Deaktivieren der folgenden Weiterleitungen;
  • responseXML für Text/HTML-Dokumente;
  • Cross-Site XMLHttpRequest;
  • responseBody mit Byte-Streams umgehen;
  • overrideMimeType, um MIME-Typen zu beheben;
  • getRequestHeader() und removeRequestHeader().

Allerdings würde ich nicht meinen Atem halten, bis diese von allen Browsern implementiert ist. Möglicherweise möchten Sie einen serverseitigen Proxy verwenden, um dies zu behandeln. Schreiben Sie einfach ein kurzes Skript, um eine HEAD Anfrage in Ihrer bevorzugten serverseitigen Sprache/Framework zu erstellen, und verwenden Sie dann Ajax, um diesen Dienst abzufragen. Sie können auch Anfragen an Domains von Drittanbietern über den Proxy als positiven Nebeneffekt erledigen.

+0

Wird dies überhaupt in jedem Browser implementiert? Mich interessiert vor allem eine Lösung/einen Hack für google-chrome/webkit. – antonj

+0

@Blastura: Ich bin mir nicht sicher, aber das glaube ich nicht. –

+0

Die neue 'fetch()' API hat diese Funktion erworben, aber dieser API fehlen heute einige Funktionen in XHR (einschließlich Timeouts und Annullierung). – EricLaw

-11

Stoppen Sie die Umleitung ist MÖGLICH.

Die meisten Browser stoppen die Weiterleitung, wenn zu viele Umleitungen vorhanden sind.In Chrome wird nach 20 mal Umleitung ein Fehler ERR_TOO_MANY_REDIRECTS angezeigt. Testcode wie folgt aus (es als redir.php speichern):

<?php 
$times = isset($_GET['t']) ? intval($_GET['t']) : 1; 
if ($times < 20) { 
    header("Location: redir.php?t=".strval($times+1)); 
} else { 
    header("Location: http://the.final.target.url/which.will.give.you.a.301.header.but.you.do.not.want.to.follow.it"); 
} 

Dann werden Sie die Umleitung finden gestoppt, wie wir vorbehalten. Funktioniert auch mit xhr und common JS, wie (new Image).src="some.url".

Noch eine Sache, die Begrenzung der maximalen Umleitungen ist zwischen Browsern unterschiedlich. Sie können die Anzahl testen und finden selbst redir.php, oder es von diesem Thema finden: In Chrome, how many redirects are "too many"?

Glad wenn hilfreich :)

+0

Ist das jquery oder php? _(Scherz)_ –

1

Und jetzt ist es möglich! zumindest in Firefox und Chrome-Browser

Ich war fast verzweifelt, wenn ich die Antwort gefunden: https://stackoverflow.com/a/8056313/995007

Ex:

var xhttp = new XMLHttpRequest(); 
    xhttp.onload = function() { 
     console.log(xhttp.responseURL); // Here you are! 
    }; 
    xhttp.open('GET', 'https://www.ddd.com/news', true); 
    xhttp.send(); 
Verwandte Themen