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

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

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

В служебных целях я хотел бы иметь возможность сделать запрос на старый URL-адрес и получить новый, т. Е. Отправить запрос по адресу /oldpage.aspx? Foo = someParam & quot ;, вернуть новый URL-адрес & quot; / arbitaryNewPageName / someParam & Quot ;.

Я играл с этим в консоли firebug:

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

Я вижу в firebug, что когда этот код запускается, он выполняет один GET для /oldpage.aspx? Foo = someParam & quot; и получает ответ 301, затем другой GET для &bitaryNewPageName / someParam & quot ;.

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

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

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

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

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

Суть моего вопроса заключается в следующем:Can I get the URL my request was redirected to from the XHR? Пока что, похоже, ответ «нет».

 Zachary01 мая 2012 г., 00:37
Вы можете прочитать этот пост:stackoverflow.com/a/1534662/64741
 JAAulde01 мая 2012 г., 12:57

Ответы на вопрос(3)

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

Решение Вопроса

Я нашел способ сделать это, используя фактический объект 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, на который перенаправляется запрос.

 18 дек. 2014 г., 01:49
Проблема этого решения заключается в том, что оно работает только в том случае, если ответ является HTML-содержимым (может быть, XML тоже?). Если вы получаете JSON, простой текст, изображение, вообще ничего и т. Д., Это не сработает.

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

Ajax Redirection Handling а такжеЗапретить перенаправление 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);
        }
    });
}
 01 мая 2012 г., 04:39
Да, я запутался, думая больше об оригинальном URL. Пытатьсяthis.url внутри метода успеха. Я обновил ответ соответственно.
 BenWillkommen01 мая 2012 г., 15:55
К сожалению, this.url содержит устаревший URL, который я уже знаю.
 18 дек. 2014 г., 01:52
Извини заreally позднее обновлениеjqxhr.getResponseHeader("X-MYAPP-PATH") будет работать, только если сервер действительно отправляет этот заголовок. Если вы не контролируете, какие заголовки возвращаются, это не сработает для вас.
 BenWillkommen01 мая 2012 г., 04:13
Когда вы говорите «URL ответа», подразумеваете ли вы URL, на который в конечном итоге перенаправляется мой запрос? Как я могу получить доступ к этому?
 03 мая 2012 г., 01:02
Извините за позднее обновление. Пытатьсяjqxhr.getResponseHeader("X-MYAPP-PATH") вместо этого, и дайте мне знать, как это происходит.

Ваш ответ на вопрос