为什么 AJAX 返回0 HTTP状态码?

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

186205 次浏览

根据我的经验,当:

  • 正在执行跨网站脚本(拒绝访问)
  • 请求无法访问的 URL (输入错误、 DNS 问题等)
  • 请求会被拦截(检查你的广告拦截器)
  • 如上所述,如果请求被中断(浏览器从页面导航)

状态码0表示无法访问请求的 URL。把 http://something/something改成 https://something/something对我来说很管用。当状态代码为0时,IE 会抛出一个错误,说“权限拒绝”,其他浏览器则不会。

因为当你在谷歌上搜索 ajax 状态0的时候会出现这个问题,我想留下一些建议,但是浪费了我好几个小时的时间。我正在用 ajax 调用一个 PHP 服务,这个服务碰巧是 Phil 的 REST _ Controller for Codeigniter (不确定这是否和它有什么关系) ,并且一直得到状态0,readystate 0,这快把我逼疯了。我正在调试它,并注意到当我回显并返回消息而不是退出消息时,我将获得成功。最后我关闭了调试并尝试了一下,它工作了。似乎使用 PHP 的 xDebug 调试器以某种方式修改了响应。如果您使用 PHP 调试器,请尝试关闭它,看看是否有帮助。

在我的例子中,在 ajax 设置中设置 url: ''将导致 ie8中的状态代码0。.似乎我就是不能容忍这样的环境。

我还发现了 jquery 为您提供状态代码0的另一种情况——如果由于某种原因没有定义 XMLHttpRequest,您将得到这个错误。

显然,这种情况通常不会发生在网络上,但是在一个每晚构建的 Firefox 中的一个 bug 导致这种情况在我正在编写的一个附加组件中突然出现。:)

“意外”提交表格正是我遇到的问题。我只是删除了所有的 FORM 标签,这似乎解决了问题。谢谢大家!

值得注意的是,Ajax 调用甚至可能在一个会话中失败,这个会话是由一个以 www 为前缀的特定域的 cookie 定义的。当你调用你的 php 脚本例如没有 www。前缀的网址,调用将失败,反之亦然。

另一个例子:

如果您有 发送一个 AJAX 调用,并在得到 AJAX 响应之前触发浏览器刷新,那么可以获得 0的状态代码。AJAX 调用将被取消,您将获得这个状态。

我们也遇到过类似的问题—— 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:~$

Php 包含崩溃代码的地方。 没有从服务器返回的数据(甚至没有头) = > ajax 调用中止,状态为0。

这里使用 <button onclick="">submit</button>时也存在同样的问题,然后使用 <input type="button" onclick="">解决了这个问题

我也遇到了同样的问题,这个问题与浏览器的 XSS (跨网站脚本)块有关。我设法用服务器让它工作。

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

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

将 POST 操作更改为 GET 修复了这个问题。我们不清楚 Godaddy 为什么要设置这个限制,但是更改代码比更改主机更容易。

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

我想我知道是什么导致了这个错误。

在谷歌铬有一个内置的功能,以防止 ddos 攻击谷歌铬扩展。

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

因此,可以在以下请求上接收状态0。

试图以最愚蠢的理由获得上述问题的奖项。

忘记打电话了

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

是的,我仍然从“公开”通话中得到零的状态回报。

在我们的示例中,页面链接从 Https更改为 译注:。即使用户已经登录,他们也无法使用 AJAX 进行加载。

在发出请求时观察浏览器控制台,如果您看到“同源策略不允许读取 http ajax 上的远程资源... ..。原因: cors 头“访问控制-允许-起源”丢失,然后您需要添加“访问控制-允许-起源”在响应头。Exa: 在 java 中,您可以设置这个值,比如 response se.setHeader (“ Access-Control-allow-Origin”,“ *”) ,其中 response 为 HttpServletResponse。

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

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

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