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

14

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

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

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

Я играл с этим в консоли 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 & quot; и получает ответ 301, затем другой GET для &bitaryNewPageName / someParam & quot ;.

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

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

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

Бизнес-пользователь попросил меня создать список, который связывает устаревшие URL-адреса с новыми URL-адресами. Поскольку я уже реализовал средство перенаправления устаревших URL-адресов на новые URL-адреса на сервере, я надеялся свести на нет эту работу и создать сценарий, который помещал бы запросы на устаревшие 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);
            }
        });
}

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

возможный дубликатDetermining what jQuery .ajax() resolves a string of redirects to JAAulde
Вы можете прочитать этот пост:stackoverflow.com/a/1534662/64741 Zachary

Ваш Ответ

3   ответа
1

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

1

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

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

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

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);
        }
    });
}
Да, я запутался, думая больше об оригинальном URL. Пытатьсяthis.url внутри метода успеха. Я обновил ответ соответственно.
К сожалению, this.url содержит устаревший URL, который я уже знаю. BenWillkommen
Извини заreally позднее обновлениеjqxhr.getResponseHeader("X-MYAPP-PATH") будет работать, только если сервер действительно отправляет этот заголовок. Если вы не контролируете, какие заголовки возвращаются, это не сработает для вас.
Когда вы говорите «URL ответа», подразумеваете ли вы URL, на который в конечном итоге перенаправляется мой запрос? Как я могу получить доступ к этому? BenWillkommen
Извините за позднее обновление. Пытатьсяjqxhr.getResponseHeader("X-MYAPP-PATH") вместо этого, и дайте мне знать, как это происходит.

Похожие вопросы