Когда ответ на $.ajax-это 301, могу ли я программно получить новый URL-адрес?

есть ли способ получить URL, на который вы в конечном итоге перенаправлены, когда ответ на запрос xhr равен 301?

у меня есть сайт, который содержит множество устаревших URL-адресов из старой версии, которые возвращают 301 ответ на правильный новый URL-адрес.

для утилиты я хотел бы иметь возможность сделать запрос на старый URL-адрес и получить новый, то есть отправить запрос на "/oldpage.аспн?foo=someParam", верните новый url "/arbitaryNewPageName / someParam".

Я играл с этим в консоли 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);
            }
        });

Я вижу в firebug, что когда этот код запускается, он попадает в "/oldpage.аспн?foo=someParam", и получает ответ 301, затем другой получает "/ arbitaryNewPageName / someParam".

для первого запроса я вижу перенаправленный URL-адрес в значении местоположения заголовка ответа. К сожалению, второй запрос-это то, что передается в $.Аякс.успех функция, и она имеет только перенаправленный URL-адрес в значении Referrer заголовка запроса.

возможно ли перехватить ответ на первый ответ или, возможно, увидеть заголовки запроса для второго запроса?

Edit: спасибо всем за ответы. Я думаю, что мне нужно дать немного фона, чтобы уточнить, что именно я ищу.

бизнес-пользователь попросил меня создать список, который связывает устаревшие URL-адреса с новыми URL-адреса. Поскольку я уже реализовал средство перенаправления устаревших URL-адресов на новые URL-адреса на сервере, я надеялся отказаться от этой работы и создать скрипт, который размещал запросы на устаревшие URL-адреса и получал URL-адреса, на которые были перенаправлены запросы. Что-то вроде этого:--3-->

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

суть моего вопроса такова: могу ли я получить URL-адрес, на который был перенаправлен мой запрос из XHR? до сих пор, похоже, ответ "нет".

3 ответов


Я нашел способ сделать это, используя фактический объект XHR вместо метода ajax jQuery из этого ответа: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);

С этим я смог разместить запрос на URL, который, как я знаю, вернет 301, и получить URL, на который перенаправляется запрос.


Он предназначен для работы прозрачно, по крайней мере, это то, что предлагается здесь:

Обработка Перенаправления Ajax и предотвратить перенаправление Xmlhttprequest

одна вещь, которую вы можете сделать, это передать URL-адрес в качестве параметра контекста вызову AJAX, а затем в успехе сравнить URL-адрес ответа со свойством URL-адреса объекта контекста.

см. здесь для получения информации о контексте: http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings

обновление:

настоящий сложный-это новый URL, я думаю, вы можете получить его, позвонив this.url Если вы не переопределите 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);
        }
    });
}

Проверьте XMLHttpRequest.responseURL