Answers:
AJAX请求永远不会有机会不遵循重定向(即,它必须遵循重定向)。可以在此答案中找到更多信息https://stackoverflow.com/a/2573589/965648
欢迎来到未来!
现在,我们从xhr对象获得了一个“ responseURL”属性。好极了!
但是,jQuery(至少1.7.1)没有直接访问XMLHttpRequest对象。您可以使用以下方式:
var xhr;
var _orgAjax = jQuery.ajaxSettings.xhr;
jQuery.ajaxSettings.xhr = function () {
xhr = _orgAjax();
return xhr;
};
jQuery.ajax('http://test.com', {
success: function(responseText) {
console.log('responseURL:', xhr.responseURL, 'responseText:', responseText);
}
});
这不是一个干净的解决方案,我想jQuery团队会在将来的版本中为responseURL做些事情。
提示:只需将原始URL与responseUrl进行比较即可。如果相等,则没有重定向。如果它是“ undefined”,则可能不支持responseUrl。但是,正如Nick Garvey所说,AJAX请求永远不会有机会不遵循重定向,但是您可以通过使用responseUrl属性来解决许多任务。
尽管回答了这个问题的其他人都(非常)正确地认为浏览器对我们隐藏了此信息,但我认为我应该发布一种解决方法:
我配置了服务器应用程序以设置X-Response-Url
包含请求的URL 的自定义响应标头()。每当我的Ajax代码收到响应时,它都会检查是否xhr.getResponseHeader("x-response-url")
已定义,在这种情况下,它将其与最初通过所请求的url进行比较$.ajax()
。如果字符串不同,我知道有一个重定向,此外,我们实际到达的是哪个URL。
这确实具有需要一些服务器端帮助的缺点,并且如果在往返过程中URL受到干扰(由于引用/编码问题等),也可能会崩溃……但是对于99%的情况,这似乎得到了解决。工作完成。
在服务器端,我的特定情况是使用Pyramid Web框架的python应用程序,并且使用了以下代码段:
import pyramid.events
@pyramid.events.subscriber(pyramid.events.NewResponse)
def set_response_header(event):
request = event.request
if request.is_xhr:
event.response.headers['X-Response-URL'] = request.url