当对$ .ajax的响应为301时,我可以通过编程方式获取新的URL吗?

当对xhr请求的响应是301时,有没有办法获取最终重定向到的URL?

我的网站包含来自旧版本的大量遗留url,这些url会返回301对正确新url的响应。

出于实用目的,我希望能够向旧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的方法,因此我希望能够减少这项工作,并创建一个脚本,将请求放置到旧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吗? 到目前为止,答案似乎是“不”。

我找到了一种方法,通过使用实际的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。

它意味着透明地工作,至少这是建议的:

Ajax重定向处理和防止Xmlhttprequest的重定向

您可以做的一件事是将URL作为上下文参数传递给AJAX调用,然后在成功中将响应URL与上下文对象的URL属性进行比较。

有关上下文的信息,请参见此处: http : //api.jquery.com/jQuery.ajax/#jQuery-ajax-settings

更新:

真正棘手的是新的URL,我想你可以通过调用this.url得到它,如果你不覆盖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); } }); } 

查看XMLHttpRequest.responseURL