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


Answers:


110

另一种情况:

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


9
感谢您指出这一点,这使我意识到(以及浏览器刷新)表单提交可以取消ajax调用。
Magnus Smith

1
只要做到<form onsubmit="return false;">
Heitor

1
@Heitor的建议对我有用-我表单的“提交”按钮正在刷新页面,与此同时,当我单击“提交”按钮时,我有javascript试图运行ajax调用。结果是ajax调用被取消
Nic Sc​​ozzaro

嘿,我错过了e.preventDefault();
SparK '19

97

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

  • 做跨站点脚本(拒绝访问)
  • 请求无法访问的URL(输入错误,DNS问题等)
  • 否则该请求将被拦截(请检查您的广告拦截器)
  • 如上所述,如果请求被中断(浏览器导航离开页面)

1
连接被拒绝时,我得到了它。例如,当使用Visual Studio调试站点时,如果我停止了调试会话,则任何尝试连接的请求都将获得net :: ERR_CONNECTION_REFUSED,状态码将为零。这是有道理的,因为如果您无法连接到本应提供该状态的服务器,那么就不会有状态代码。
Triynko 2015年

我可以确认。关闭Web服务器后,我的状态为== 0。
9ilsdx 9rvj 0lo

我因为“跨站点脚本编制”而出错;我该怎么办?

1
@nasimjahednia查找CORS ...您要访问的服务器需要允许您域中的跨站点脚本编写。
兰登

我很困惑。有没有办法让HTTP错误代码返回?这里有很多不同的情况(415、404等?)
Edwin Evans

8

使用时,这里也有同样的问题<button onclick="">submit</button>。然后用<input type="button" onclick="">


1
答对了!!任何人都可以解释为什么吗?
豪尔赫

3
默认情况下,HTML按钮的类型为“提交”,因此单击它会尝试提交表单数据。因此它将执行click操作,然后尝试提交。如果您使用“按钮”类型,它将不再是默认类型,而只会执行onclick。
Christophe Roussy

7

状态代码0表示无法访问所请求的网址。通过将http:// something / something更改为https:// something / something对我有用。当状态代码为0时,IE引发错误,提示“权限被拒绝”,其他浏览器则不显示。


在这种情况下,Chrome当前将使请求处于“已停止”状态,直到超时为止。它可能是由该服务器在先前请求中返回的Strict-Transport-Security标志引起的,也可能是与请求一起发送的cookie上的Secure / HttpOnly标志。
Shane Hughes

7

重要的是要注意,即使在由特定域名(以www为前缀)的cookie定义的会话中,ajax调用也可能失败。然后,当您调用您的PHP脚本时,例如不使用www。网址中的前缀,调用也会失败,反之亦然。


4

这篇文章对我有所帮助。我正在通过AJAX提交表单,却忘记了使用return false(在我的Ajax请求之后),这导致了经典的表单提交,但奇怪的是它没有完成。


黎明,我讨厌我又被这个人抓住了!<form onsubmit="return false;">做到了。
Heitor

3

因为这在您将Google ajax状态设为0时显示出来,所以我想留下一些浪费时间的小窍门...我正在使用ajax调用一个PHP服务,而该服务恰好是Phil的Codeigniter的REST_Controller(不确定是否已并与之无关)并保持状态0,就绪状态0,这真让我发疯。我正在调试它,并注意到当我回显并返回而不是退出消息时,我会成功。最终,我关闭了调试功能,并尝试了一下,并成功了。似乎使用PHP的xDebug调试器正在以某种方式修改响应。如果您使用的是PHP调试器,请尝试将其关闭以查看是否有帮助。


3

我发现另一种情况,其中jquery为您提供状态代码0 -如果由于某种原因未定义XMLHttpRequest,则会出现此错误。

显然,这通常不会在网络上发生,但是夜间firefox构建中的错误导致该问题在我正在编写的附件中出现。:)


1
您的观点是,我的jQuery.ajax()XHR对象有问题。请求未能甚至在AJAX调用创建,仍然得到f.open是不是引起的功能和状态代码0:我回来了$.ajaxSettings.xhr,从对象$.ajaxSetup({xhr}),返回new window.XMLHttpRequest();,而不是解决了问题
klimpond


2

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


2

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

在我们的案例中,问题是HTTP服务器崩溃。PHP中的一些错误正在吹散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。


2

在我的情况下,这是由于在django服务器下运行http://127.0.0.1:8000/却将ajax调用发送至引起的http://localhost:8000/。即使您希望它们映射到相同的地址,他们也不要这样做,以确保您没有将请求发送到本地主机。


2

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


有趣。我希望这是我的情况。由于我的iframe以https打开,并且结果成功后,我将ajax发送到http,然后获得状态0
声波

1

以我为例,url: ''在ajax设置中进行设置会导致ie8中的状态代码为0。看来,ie就是不能容忍这种设置。


1

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

将操作从POST更改为GET可解决此问题。尚不清楚为什么Godaddy施加此限制,但是更改代码比更改主机要容易。


1

我想我知道什么可能导致此错误。

在谷歌浏览器中,有一个内置功能可以防止ddos攻击谷歌浏览器扩展程序。

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

因此,可以在后续请求中接收状态0。


1

尝试以最愚蠢的理由赢得所描述问题的奖项。

忘了打电话

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

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



1

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


0

发出请求时,请观察浏览器控制台,如果看到“ Same Origin Policy不允许读取http ajax .....原因:cors标头'access-control-allow-origin'丢失”,那么您需要在响应标头中添加“ Access-Control-Allow-Origin”。例:在Java中,您可以像response.setHeader(“ Access-Control-Allow-Origin”,“ *”)这样设置,其中response是HttpServletResponse。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.