2012-04-30 15 views
14

Czy istnieje sposób na uzyskanie adresu URL, do którego nastąpi ostateczne przekierowanie, gdy odpowiedź na żądanie xhr wynosi 301?

Mam witrynę, która zawiera wiele starszych adresów URL ze starszej wersji, które zwracają 301 odpowiedzi na poprawny nowy adres URL.

Dla celów użytkowych, chciałbym mieć możliwość złożenia wniosku do starego adresu URL i móc pobrać nowe, tj. Wysłać zapytanie do "/oldpage.aspx?foo=someParam", uzyskać nowe url "/ arbitraryNewPageName/someParam".

Grałem około z tym w konsoli Firebug

$.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); 
      } 
     }); 

widzę w Firebug, że gdy ten kod działa, robi jeden dostać do „/oldpage.aspx?foo=someParam” i otrzymuje odpowiedź 301, następnie inny GET do "/ arbitraryNewPageName/someParam".

Po pierwszym żądaniu widzę przekierowany adres URL w polu Lokalizacja nagłówka odpowiedzi. Niestety drugie żądanie jest przekazywane do funkcji $ .ajax.success i ma tylko przekierowany adres URL w wartości Referrer nagłówka żądania.

Czy istnieje sposób, aby przechwycić odpowiedź na pierwszą odpowiedź, lub może zobaczyć nagłówki żądań dla drugiego żądania?

Edytuj: Dziękuję wszystkim za odpowiedzi. Myślę, że muszę podać trochę tła, aby wyjaśnić, czego dokładnie szukam.

Użytkownik biznesowy poprosił mnie o utworzenie listy, która łączy starsze adresy URL z nowymi adresami URL. Ponieważ już wdrożyłem sposób przekierowania starszego adresu URL na nowe adresy URL na serwerze, miałem nadzieję, że odłożyłem tę pracę i utworzę skrypt, który umieszczał żądania na starszych adresach URL i uzyskiwał adresy URL, do których przekierowano żądania. Coś takiego:

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); 
      } 
     }); 
} 

Sedno moje pytanie jest takie: Czy mogę dostać URL mój wniosek został przekierowany z XHR? Jak dotąd odpowiedź brzmi "nie".

+0

Możecie chcą czytać tego posta: http://stackoverflow.com/a/1534662/64741 – Zachary

+0

możliwe duplikat [Ustalenie co .ajax jQuery() rozwiązuje ciąg przekierowań to] (http://stackoverflow.com/questions/6767618/determining-what-jquery-ajax-resolves-a-string-of-redirects-to) – JAAulde

Odpowiedz

1

znalazłem sposób, aby to zrobić za pomocą rzeczywistego obiektu XHR zamiast metody ajax jQuery z tej odpowiedzi: 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); 

Dzięki temu udało mi się złożyć wniosek do adresu URL Wiem, że zwróci 301 i uzyska adres URL, do którego przekierowano żądanie.

+0

Problem z tym rozwiązaniem polega na tym, że działa on tylko wtedy, gdy odpowiedź jest treścią HTML (może również XML?). Jeśli otrzymasz JSON, zwykły tekst, obraz, nic w ogóle, itp., To nie zadziała. – jordanbtucker

1

Jest przeznaczona do pracy w sposób przejrzysty, przynajmniej to, co sugeruje tutaj:

Ajax Redirection Handling i Prevent redirection of Xmlhttprequest

Jedną rzeczą, jaką można zrobić, to przekazać URL jako parametr kontekst wywołania AJAX, a następnie w sukces porównać adres URL odpowiedzi z właściwością URL obiektu kontekstowego.

Zobacz tutaj aby uzyskać informacje na temat kontekstu: http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings

Aktualizacja:

Prawdziwy podchwytliwe jest nowy adres URL, myślę, że można je dostać poprzez wywołanie this.url jeśli nie zastępują th 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

Kiedy mówisz "URL odpowiedzi", masz na myśli adres URL, który moja prośba jest ostatecznie przekierowana na? Jak mogę uzyskać dostęp do tego? – BenWillkommen

+0

Tak, myliłem się, myśląc więcej o oryginalnym adresie URL. Wypróbuj 'this.url' wewnątrz metody sukcesu. Odpowiednio zaktualizowałem odpowiedź. – Meligy

+0

Niestety, plik ten.url zawiera starsze adresy URL, które już znam. – BenWillkommen

1

Wyjazd XMLHttpRequest.responseURL