【问题标题】:In an AJAX call, 302 is not followed在 AJAX 调用中,不遵循 302
【发布时间】:2011-10-20 18:47:59
【问题描述】:

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

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

如果我在不涉及 javascript 的情况下访问同一页面,则一切正常,正如我所说,AJAX 在我的本地机器上工作,但在生产服务器上不工作。

有人知道是什么原因造成的吗?

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

【问题讨论】:

  • 我假设 302 重定向到同一域上的另一个资源?
  • 确实如此。事实证明,kohana 中存在一个错误,尽管这导致重定向是 HTTP 而不是 HTTPS。这一定是导致浏览器取消请求的原因。
  • 优秀。将其添加为下面的答案 - 两天后,您将能够接受您的答案作为正确的答案,以便将来遇到类似问题的人可以找到它。

标签: jquery ajax


【解决方案1】:

原来重定向代码中的一个错误导致重定向转到 http://,而请求的页面是 https://。这使得浏览器拒绝跟随重定向。

【讨论】:

  • 那么你如何解决你的查询,就像我面临的一样。
【解决方案2】:
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

【讨论】:

  • 浏览器不应该将 302 传递给 JS,因为浏览器透明地处理重定向,所以 jQuery 永远不会知道它被重定向了。我不清楚这是否是所有浏览器,但 Chrome 显然是这样做的,其他人也类似地报告了 Opera/FF。
  • '浏览器不应将 302 传递给 JS' 并不意味着您必须否决答案。自己尝试上面的代码,然后在错误的情况下给出正确的答案,而不是在不知情的情况下投票。并查看 3 个赞成票
  • xhr.status == 302 永远不应该发生,因为 302 将由浏览器处理,然后只会向 JS 返回 200 或其他错误代码,所以我认为这个适得其反的建议。但是,我将删除 -1,因为您确实链接到其他问题。我将提供不同的答案。
  • 除非您编辑答案,否则我似乎无法取消投票,抱歉给您带来麻烦。
  • 顺便说一句,此代码与此处发布的@Strelok 的代码完全相同:stackoverflow.com/questions/373087/…,投票率很低。而且这个答案要早得多。
【解决方案3】:

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

我意识到我使用的是相对路径,例如HttpResponseRedirect('/path/to/')。在某些层上,该 url 前面带有 http:// 前缀,这就是浏览器收到的内容:http://example.com/path/to/

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

【讨论】:

    【解决方案4】:

    基于这个答案: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') 之后触发

    【讨论】:

    • 我认为这不是一个好的解决方案。这是否意味着我必须把它放在每一页上?如果我理解错了,请纠正我。
    • 上面的代码是 Javascript,所以只有在需要它的每个页面上加载到网络浏览器时才会运行。
    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2015-06-07
    • 2022-10-02
    • 2013-08-15
    • 2014-07-30
    相关资源
    最近更新 更多