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