【问题标题】:Why is AJAX returning HTTP status code 0?为什么 AJAX 返回 HTTP 状态码 0?
【发布时间】:2011-01-01 07:38:34
【问题描述】:

由于某种原因,在使用 AJAX(与我的 开发的应用程序)时,浏览器会停止上传并返回0 的状态代码。为什么会这样?

【问题讨论】:

    标签: dashcode ajax http-status-codes


    【解决方案1】:

    另一种情况:

    如果您发送了 AJAX 调用并且在获得 AJAX 响应之前触发了浏览器刷新,则可能会获得状态代码 0。 AJAX 调用将被取消,您将获得此状态。

    【讨论】:

    • 感谢您指出这一点,这让我意识到(以及浏览器刷新)表单提交可以取消 ajax 调用。
    • 随便<form onsubmit="return false;">
    • @Heitor 的建议对我有用——我的表单的“提交”按钮正在刷新页面,同时当单击“提交”按钮时,我有 javascript 试图运行 ajax 调用。结果是ajax调用被取消了
    • 嘿,我错过了e.preventDefault();
    【解决方案2】:

    根据我的经验,在以下情况下您会看到状态为 0:

    • 执行跨站点脚本(访问被拒绝)
    • 请求无法访问的 URL(错字、DNS 问题等)
    • 请求被拦截(检查您的广告拦截器)
    • 如上,如果请求被中断(浏览器导航离开页面)

    【讨论】:

    • 当连接被拒绝时我得到它。例如,在使用 Visual Studio 调试我的站点时,如果我停止了调试会话,则任何尝试连接的请求都会得到 net::ERR_CONNECTION_REFUSED 并且状态码将为零。这是有道理的,因为如果您无法连接到本应提供状态码的服务器,您就无法获得状态码。
    • 我可以确认。关闭我的网络服务器后,我的状态==0。
    • @nasimjahednia 查找 CORS...您尝试访问的服务器需要允许从您的域执行跨站点脚本。
    • 我很困惑。有没有办法得到返回的 HTTP 错误码?这里有很多不同的情况(415、404 等?)
    • @EdwinEvans 没有 HTTP 响应代码,因为在这些情况下服务器永远不会响应。
    【解决方案3】:

    使用<button onclick="">submit</button> 时出现同样的问题。然后用<input type="button" onclick="">解决了

    【讨论】:

    • 宾果游戏!任何人都可以解释为什么会这样?
    • 默认情况下 HTML 按钮类型为“提交”,因此单击它将尝试提交表单数据。所以它会执行点击动作,然后尝试提交。如果您使用类型“按钮”,则它不再是默认类型,只会执行 onclick。
    【解决方案4】:

    状态码 0 表示请求的 url 不可访问。通过将 http://something/something 更改为 https://something/something 为我工作。 IE在状态码为0时会抛出“permission denied”的错误,其他浏览器不会。

    【讨论】:

    • 在这种情况下,chrome 当前会将请求保持在“已停止”状态,直到超时。它可能是由来自该服务器的先前请求中返回的 Strict-Transport-Security 标志引起的,也可能是与请求一起发送的 cookie 上的 Secure/HttpOnly 标志。
    【解决方案5】:

    需要注意的是,即使在会话中,ajax 调用也可能会失败,该会话由具有前缀为 www 的特定域的 cookie 定义。然后当你调用你的 php 脚本时,例如没有 www。 url 中的前缀,调用将失败,反之亦然。

    【讨论】:

      【解决方案6】:

      因为这会在您使用 google ajax status 0 时显示出来,所以我想留下一些提示,这让我浪费了数小时的时间...我正在使用 ajax 调用 PHP 服务,该服务恰好是 Phil 的 Codeigniter 的 REST_Controller(不确定如果这与它有什么关系)并不断获得状态 0,就绪状态 0,这让我发疯了。我正在调试它,并注意到当我回显并返回而不是退出消息时,我会成功。最后我关闭调试并尝试,它工作。似乎带有 PHP 的 xDebug 调试器以某种方式修改了响应。如果您使用 PHP 调试器,请尝试将其关闭以查看是否有帮助。

      【讨论】:

        【解决方案7】:

        This article 帮助了我。我通过 AJAX 提交表单并忘记使用 return false(在我的 ajax 请求之后),这导致了经典的表单提交,但奇怪的是它没有完成。

        【讨论】:

        • 黎明我讨厌我又被这个抓住了! <form onsubmit="return false;"> 成功了。
        【解决方案8】:

        我发现 jquery 为您提供状态代码 0 的另一种情况——如果由于某种原因未定义 XMLHttpRequest,您将收到此错误。

        显然,这通常不会在网络上发生,但是夜间 Firefox 构建中的一个错误导致它出现在我正在编写的附加组件中。 :)

        【讨论】:

        • 你说得对,我对jQuery.ajax() XHR 对象有疑问。该请求甚至没有在 AJAX 调用上创建,仍然得到 f.open 不是函数和状态码 0。原因:我从 $.ajaxSetup({xhr}) 返回 $.ajaxSettings.xhr 对象,返回 new window.XMLHttpRequest(); 反而解决了问题跨度>
        【解决方案9】:

        “意外”表单提交正是我遇到的问题。我刚刚完全删除了 FORM 标签,这似乎解决了这个问题。谢谢大家!

        【讨论】:

          【解决方案10】:

          我遇到了同样的问题,它与浏览器的 XSS(跨站点脚本)阻止有关。我设法使用服务器使其工作。

          看看:http://www.daniweb.com/web-development/javascript-dhtml-ajax/threads/282972/why-am-i-getting-xmlhttprequest.status0

          【讨论】:

            【解决方案11】:

            我们遇到了类似的问题 - jquery ajax 调用上的状态代码 0 - 我们花了一整天的时间来诊断它。由于还没有人提到这个原因,我想我会分享一下。

            在我们的例子中,问题是 HTTP 服务器崩溃。 PHP 中的一些 bug 正在攻击 Apache,所以在客户端它看起来像这样:

            mirek@toccata:~$ telnet our.server.com 80
            Trying 180.153.xxx.xxx...
            Connected to our.server.com.
            Escape character is '^]'.
            GET /test.php HTTP/1.0
            Host: our.server.com
            
            Connection closed by foreign host.
            mirek@toccata:~$ 
            

            其中 test.php 包含崩溃代码。 没有从服务器返回数据(甚至没有标头)=> ajax 调用被中止,状态为 0。

            【讨论】:

              【解决方案12】:

              就我而言,这是由于在http://127.0.0.1:8000/ 下运行我的django 服务器但将ajax 调用发送到http://localhost:8000/ 而引起的。即使您希望它们映射到相同的地址,它们也不能确保您没有将请求发送到 localhost。

              【讨论】:

                【解决方案13】:

                在我们的例子中,页面链接从 https 更改为 http。即使用户已登录,他们也无法使用 AJAX 加载。

                【讨论】:

                • 有趣。我希望这是我的情况。由于我的 iframe 使用 https 打开并且结果成功我将 ajax 发送到 http 然后我得到状态 0
                【解决方案14】:

                在我的例子中,在 ajax 设置中设置 url: '' 会导致 ie8 中的状态码为 0.. 似乎 ie 只是不能容忍这样的设置。

                【讨论】:

                  【解决方案15】:

                  对我来说,这个问题是由托管公司 (Godaddy) 将具有大量响应数据(超过几十 KB)的 POST 操作视为某种安全威胁引起的。如果在一分钟内发生超过 6 次,则主机拒绝执行下一分钟响应 POST 请求的 PHP 代码。我不完全确定主机做了什么,但我确实看到,通过 tcpdump,一个 TCP 重置数据包作为对来自浏览器的 POST 请求的响应而出现。这导致 jqXHR 对象中返回的 http 状态码为 0。

                  将操作从 POST 更改为 GET 解决了问题。目前尚不清楚 Godaddy 为何会施加此限制,但更改代码比更改主机更容易。

                  【讨论】:

                    【解决方案16】:

                    我想我知道可能导致此错误的原因。

                    在 google chrome 中,有一个内置功能可以防止对 google chrome 扩展的 ddos​​ 攻击。

                    当 ajax 请求连续返回 500+ 个状态错误时,它开始限制请求。

                    因此有可能在以下请求中收到状态 0。

                    【讨论】:

                      【解决方案17】:

                      为了描述问题的最愚蠢的原因而试图赢得奖品。

                      忘记打电话

                      xmlhttp.send(); //yes, you need this pivotal line!
                      

                      是的,我仍然从“打开”调用中得到状态返回为零。

                      【讨论】:

                        【解决方案18】:

                        就我而言,我得到了这个,但只在 Safari Mobile 上。问题是我使用的是完整的 URL (http://example.com/whatever.php) 而不是相对的 URL (whatever.php)。但这没有任何意义,它不可能是 XSS 问题,因为我的网站托管在 http://example.com。我猜 Safari 会查看 http 部分并自动将其标记为不安全请求,而无需检查 URL 的其余部分。

                        【讨论】:

                          【解决方案19】:

                          在我的故障排除中,我发现此 AJAX xmlhttpRequest.status == 0 可能意味着客户端调用尚未到达服务器,但由于客户端问题而失败。如果响应来自服务器,则状态必须是那些 1xx/2xx/3xx/4xx/5xx HTTP 响应代码。此后,故障排除应集中在客户端问题上,可能是 Internet 网络连接中断或上述@Langdon 描述的问题之一。

                          【讨论】:

                            【解决方案20】:

                            在发出请求时观察浏览器控制台,如果您看到“同源策略不允许在 http ajax 读取远程资源.....原因:cors header 'access-control-allow-origin' missing”然后您需要在响应标头中添加“Access-Control-Allow-Origin”。例如:在 java 中,您可以像 response.setHeader("Access-Control-Allow-Origin", "*") 一样设置,其中 response 是 HttpServletResponse。

                            【讨论】:

                              【解决方案21】:

                              在我的例子中,我正在制作一个 Firefox 插件,但忘记为我尝试 ajax 的 url/域添加权限,希望这可以节省很多时间。

                              【讨论】:

                                猜你喜欢
                                • 2012-11-11
                                • 2015-01-12
                                • 1970-01-01
                                • 2021-10-23
                                • 2021-12-21
                                • 2017-10-09
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多