检测jQuery $ .ajax中的重定向?

kdt*_*kdt 91 ajax jquery http

我想使用jQuery获取URL并显式检查它是否以302重定向响应,但遵循重定向.

jQuery $.ajax似乎总是遵循重定向.如何防止这种情况,并在不遵循它的情况下查看重定向?

像"jquery ajax redirect"这样的标题有各种各样的问题,但它们似乎都涉及完成其他目标,而不仅仅是直接检查服务器给出的状态.

Nic*_*vey 86

AJAX请求永远不会有机会不遵循重定向(即,它必须遵循重定向).更多信息可以在这个答案/sf/answers/180151261/找到


Rik*_*avi 41

欢迎来到未来!

现在我们有来自xhr对象的"responseURL"属性.好极了!

请参阅如何在XMLHttpRequest中获取响应URL?

但是,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);
  }
});
Run Code Online (Sandbox Code Playgroud)

这不是一个干净的解决方案,我想jQuery团队将在未来的版本中为responseURL做些什么.

提示:只需将原始网址与responseUrl进行比较即可.如果它相等则没有给出重定向.如果它是"未定义",则可能不支持responseUrl.然而正如Nick Garvey所说,AJAX请求永远不会有机会不遵循重定向,但您可以使用responseUrl属性来解决许多任务.


Eli*_*ins 11

虽然回答这个问题的其他人(遗憾地)是正确的,这些信息是浏览器隐藏的,但我想我会发布一个我想出的解决方法:

我配置了我的服务器应用程序以设置X-Response-Url包含所请求的URL 的自定义响应标头().每当我的ajax代码收到响应时,它会检查是否xhr.getResponseHeader("x-response-url")已定义,在这种情况下,它会将其与最初请求的url进行比较$.ajax().如果字符串不同,我知道有一个重定向,另外,我们实际到达了什么网址.

这确实有一个缺点,需要一些服务器端的帮助,并且如果在往返期间网址被引导(由于引用/编码问题等)也可能会崩溃...但是对于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
Run Code Online (Sandbox Code Playgroud)


fvr*_*rab 6

您现在可以使用fetch API / 它返回redirected: *boolean*