在AJAX调用中,未遵循302

时间:2011-08-05 11:08:43

标签: jquery ajax

我正在使用jQuery 1.6.2向同一域上的页面发出POST AJAX请求。该页面将302重定向到另一个页面。

现在,在我的本地计算机上,此工作正常但在我们的生产服务器上,从未遵循重定向,并且在Chrome检查器中,该请求被称为“已取消”。

如果我在不涉及javascript的情况下访问同一页面,一切正常,正如我所说,AJAX可以在本地计算机上运行,​​但不能在生产服务器上运行。

有谁知道可能导致这种情况的原因?

服务器之间存在一些差异(OS X,Apache2,PHP5.3.6,本地计算机上的HTTP,Ubuntu,Lighttpd,PHP5.3.3,生产中的HTTPS),但对我来说没有任何区别应该有所不同。

4 个答案:

答案 0 :(得分:13)

结果是重定向代码中的错误导致重定向转到http://,而请求的页面是https://。这使得浏览器拒绝遵循重定向。

答案 1 :(得分:6)

function doAjaxCall() {
   $.ajaxSetup({complete: onRequestCompleted});
   $.get(yourUrl,yourData,yourCallback);
}

function onRequestCompleted(xhr,textStatus) {
   if (xhr.status == 302) {
      location.href = xhr.getResponseHeader("Location");
   }
}

以下与您的答案相关的问题。你可以从下面的链接找到答案。

Catching 302 FOUND in JavaScript

How to manage a redirect request after a jQuery Ajax call

答案 2 :(得分:3)

我认为这是服务器端问题,而不是客户端问题。当浏览器http发出ajax请求时,浏览器是否正确无法遵循重定向到https,因为这将是一个安全漏洞。

我意识到我正在使用相对路径,例如HttpResponseRedirect('/path/to/')。在某个图层上,该网址前缀为http://前缀,这是浏览器收到的内容:http://example.com/path/to/

您必须确保Location在响应标头中以完整路径发送,包括https://

答案 3 :(得分:2)

基于这个答案:https://stackoverflow.com/a/8752354/698289我发现以下代码非常有用:

$('body').ajaxComplete(function (e, xhr, settings) {
    if (xhr.status == 200) {
        var redirect = null;
        try {
            redirect = $.parseJSON(xhr.responseText).redirect;
            if (redirect) {
                window.location.href = redirect;
            }
        } catch (e) {
            return;
        }
    }
});

然后你只提供如下的JSON:

{redirect: '/redirect/to/this/path'}

ajaxComplete将确保重定向浏览器。

请注意$.ajax('complete')触发$.ajax('success')$.ajax('error')