2012-04-30 2 views
14

Gibt es eine Möglichkeit, die URL zu erhalten, an die Sie letztendlich weitergeleitet werden, wenn die Antwort auf eine xhr-Anfrage 301 ist?

Ich habe eine Website, die zahlreiche Legacy-URLs aus einer älteren Version enthält, die 301 Antworten auf die korrekte neue URL zurückgeben.

Für Dienstprogrammzwecke möchte ich in der Lage sein, eine Anfrage an eine alte URL zu stellen, und in der Lage sein, die neue Anfrage an "/oldpage.aspx?foo=someParam" zu senden, erhalten Sie die neue zurück URL "/ arbitraryNewPageName/someParam".

Ich habe mit dieser in der Firebug-Konsole spielen um:

$.ajax({ 
      url: "/oldpage.aspx?foo=someParam", 
      success: function(response, status, jqxhr){ 
      //poking around, trying to get the new URL, "/arbitraryNewPage/someParam" 
       console.log(jqxhr.getAllResponseHeaders()); 
       console.log(jqxhr); 
      }, 
      beforeSend: function(jqxhr, settings){ 
       console.log(jqxhr); 
       console.log(settings); 
      } 
     }); 

ich in Firebug sehen, dass, wenn dieser Code ausgeführt wird, tut es ein GET auf „/oldpage.aspx?foo=someParam“ , und erhält eine 301 Antwort, dann ein weiteres GET zu "/ arbitraryNewPageName/someParam".

Für die erste Anfrage, sehe ich die umgeleitete URL in der Location-Wert der Antwort-Header. Leider ist die zweite Anfrage, was an die Funktion $ .ajax.success übergeben wird, und sie hat nur die umgeleitete URL im Referrer-Wert des Anfrage-Headers.

Gibt es vielleicht eine Möglichkeit, die Antwort auf die erste Antwort abzufangen, oder vielleicht die Request-Header für die zweite Anfrage zu sehen?

Bearbeiten: Vielen Dank für die Antworten. Ich denke, ich muss einen kleinen Hintergrund geben, um zu klären, wonach genau ich suche.

Ein Geschäftsbenutzer hat mich gebeten, eine Liste zu erstellen, die ältere URLs mit neuen URLs verknüpft. Da ich bereits eine Möglichkeit implementiert habe, Legacy-URLs auf neue URLs auf dem Server umzuleiten, hoffte ich, diese Arbeit abzuhaken und ein Skript zu erstellen, das Anfragen an die Legacy-URLs und die URLs, an die die Anfragen weitergeleitet wurden, geschickt hat. Etwas wie folgt aus:

for (var i = 0; i < arrayOfLegacyUrls.length; i++) 
{ 
    $.ajax({ 
      url: arrayOfLegacyUrls[i], 
      success: function(response, status, jqxhr){ 
       var newUrl = "???"; //do magic to get URL that request was redirected to 

       writeToFileForBusinessUser(arrayOfLegacyUrls[i], newUrl); 
      } 
     }); 
} 

Der Kern meiner Frage ist: Kann ich die URL meiner Anfrage vom XHR umgeleitet wurde? Bis jetzt scheint die Antwort "nein" zu sein.

+0

Sie können diesen Beitrag lesen möchten: http://stackoverflow.com/a/1534662/64741 – Zachary

+0

möglich Duplikat [Die Bestimmung, was jQuery .ajax() löst eine Kette von Umleitungen zu] (http://stackoverflow.com/questions/6767618/determining-what-jquery-ajax-resolves-a-string-of-redirects-to) – JAAulde

Antwort

1

fand ich einen Weg, dies zu tun, indem das tatsächliche XHR-Objekt anstelle von Jquery AJAX-Methode aus dieser Antwort mit: https://stackoverflow.com/a/7015798/194099

var r = new XMLHttpRequest(); 
r.open("GET", "http://mysite.com/legacyUrl.aspx?bla=bla"); 
r.overrideMimeType("text/xml"); 
r.onload = function() 
{ 
    alert(r.responseXML.baseURI); //gets the URL the request was redirected to! huzzah! 
} 
r.send(null); 

Damit konnte ich eine Anfrage an eine URL platzieren Ich weiß, wird eine 301 zurückgeben und die URL abrufen, an die die Anfrage umgeleitet wird.

+0

Das Problem mit dieser Lösung ist, dass es nur funktioniert, wenn die Antwort HTML-Inhalt ist (vielleicht auch XML?). Wenn Sie JSON, Klartext, ein Bild, gar nichts usw. erhalten, funktioniert das nicht. – jordanbtucker

1

Es soll transparent arbeiten, zumindest das ist, was hier vorgeschlagen ist:

Ajax Redirection Handling und tun Sie könnten

Eine Sache Prevent redirection of Xmlhttprequest ist die URL als Kontextparameter auf die AJAX-Aufruf übergeben, und dann in der Erfolg Vergleichen Sie die Antwort-URL mit der URL-Eigenschaft des Kontextobjekts.

Sehen Sie hier für Informationen über den Kontext: http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings

Update:

Der wahre knifflig wird die neue URL, ich glaube, Sie es durch den Aufruf this.url erhalten, wenn Sie th nicht außer Kraft setzen econtext.

for (var i = 0; i < arrayOfLegacyUrls.length; i++) 
{ 
    $.ajax({ 
     url: arrayOfLegacyUrls[i], 
     success: function(response, status, jqxhr){ 
      var newUrl = jqxhr.getResponseHeader("X-MYAPP-PATH"); 
      writeToFileForBusinessUser(arrayOfLegacyUrls[i], newUrl); 
     } 
    }); 
} 
+0

Wenn Sie "Antwort URL" sagen, meinen Sie die URL, die Meine Anfrage wird letztendlich umgeleitet? Wie kann ich darauf zugreifen? – BenWillkommen

+0

Ja, ich war verwirrt, weil ich mehr an die ursprüngliche URL dachte. Versuchen Sie 'this.url' innerhalb der Erfolgsmethode. Ich habe die Antwort entsprechend aktualisiert. – Meligy

+0

Leider enthält this.url die alte URL, die ich bereits kenne. – BenWillkommen

1

Check out XMLHttpRequest.responseURL

Verwandte Themen