为啥 AJAX 返回 HTTP 状态码 0?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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/域添加权限,希望这可以节省很多时间。

【讨论】:

以上是关于为啥 AJAX 返回 HTTP 状态码 0?的主要内容,如果未能解决你的问题,请参考以下文章

delphi中的webbrowser ,如何获取网站返回状态码

Ajax状态值及状态码

AJAX 状态值与状态码详解

MSIE 为 Ajax 请求返回状态码 1223

如何使用 jQuery 获取 HTTP 状态码?

Ajax---错误处理