Когда ответ на $.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);
}
});
}