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

时间:2012-02-07 13:39:44

标签: jquery ajax http

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

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

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

4 个答案:

答案 0 :(得分:77)

AJAX请求永远不会有机会不遵循重定向(即必须遵循重定向)。有关详细信息,请参阅此答案https://stackoverflow.com/a/2573589/965648

答案 1 :(得分:38)

欢迎来到未来!

现在我们有一个" responseURL"来自xhr对象的属性。 YAY!

请参阅How to get response url in XMLHttpRequest?

但是,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做点什么。

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

答案 2 :(得分:9)

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

我将服务器应用配置为设置包含所请求网址的自定义响应标头(X-Response-Url)。每当我的ajax代码收到响应时,它会检查是否定义了xhr.getResponseHeader("x-response-url"),在这种情况下,它会将其与最初通过$.ajax()请求的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

答案 3 :(得分:0)

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