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

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

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

Для служебных целей я хотел бы иметь возможность сделать запрос на старый URL-адрес и иметь возможность получить новый, то есть отправить запрос на "/oldpage.aspx?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, что, когда этот код запускается, он делает GET на "/oldpage.aspx?foo=someParam" и получает ответ 301, затем другой GET на "/arbitaryNewPageName/someParam".

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

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

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

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

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?. До сих пор ответ кажется "нет".

Ответы

Ответ 1

Я нашел способ сделать это, используя настоящий XHR-объект вместо jQuery ajax-метода из этого ответа: fooobar.com/questions/135337/...

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-адрес, на который перенаправляется запрос.

Ответ 2

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

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

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

См. здесь информацию о контексте: http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings

Update:

Настоящим сложным является новый URL, я думаю, вы можете получить его, вызвав this.url, если вы не переопределите этот текст.

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

Ответ 3

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