当对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中看到,当这段代码运行时,它会对“/oldpage.aspx?foo=someParam”执行一次GET,并获得301响应,然后另一个GET为“/arbitaryNewPageName/someParam".
对于第一个请求,我在响应标头的Location值中看到重定向的URL。不幸的是,第二个请求是传递给$ .ajax.success函数的内容,它只在请求头的Referrer值中有重定向的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);
}
});
}
我的问题的关键在于:我可以从XHR获取我的请求被重定向到的URL吗?到目前为止,答案似乎是“不”。
答案 0 :(得分:1)
这意味着透明地工作,至少这是在这里所建议的:
Ajax Redirection Handling和Prevent redirection of Xmlhttprequest
您可以做的一件事是将URL作为上下文参数传递给AJAX调用,然后在成功时将响应URL与上下文对象的URL属性进行比较。
有关上下文的信息,请参阅此处:http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings
<强>更新强>
真正棘手的是新网址,如果你不覆盖econtext,我想你可以通过调用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);
}
});
}
答案 1 :(得分:1)
通过使用实际的XHR对象而不是jquery的ajax方法,我找到了一种方法来做到这一点: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);
有了这个,我就可以向我知道将返回301的URL发出请求,并获取请求被重定向到的URL。
答案 2 :(得分:1)
查看XMLHttpRequest.responseURL