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

153

在使用AJAX(我的开发的应用程序)时,出现了浏览器停止上传并返回状态码0的情况。这是为什么呢?

22个回答

123

另一种情况:

如果您在发送 AJAX 请求后触发了浏览器的刷新,在获得 AJAX 响应之前,您可能会收到状态码 0。这是因为 AJAX 请求将被取消并返回此状态码。


10
感谢您指出这一点,让我意识到除了浏览器刷新之外,表单提交也可以取消ajax调用。 - Magnus Smith
3
只需在表单中添加 <form onsubmit="return false;"> 即可。 - Heitor
2
@Heitor的建议对我很有用——我的表单的“提交”按钮正在刷新页面,同时我有javascript尝试在“提交”按钮被点击时运行ajax调用。结果是ajax调用被取消了。 - Nic Scozzaro
1
嘿,我忘记加上 e.preventDefault(); 了。 - SparK
天啊...我已经花了3个小时在这上面了。结果发现Ajax调用运行了一个重新启动Apache的脚本。它没有返回任何东西,我得到了一个0的代码...哎呀。 - EML

112

根据我的经验,以下情况会显示状态码0:

  • 进行跨站脚本攻击时(访问被拒绝)
  • 请求无法到达的URL(输入错误、DNS问题等)
  • 请求被拦截(请检查您的广告拦截器)
  • 如果请求被中断(浏览器从页面导航离开)

2
当连接被拒绝时,我会收到这个错误。例如,在使用Visual Studio调试我的网站时,如果我停止了调试会话,任何尝试连接的请求都会得到net::ERR_CONNECTION_REFUSED错误,并且状态码将为零。这是有道理的,因为如果无法连接到应该提供状态码的服务器,那么就不可能有状态码。 - Triynko
1
我可以确认。在关闭我的Web服务器后,我得到了status==0的状态。 - 9ilsdx 9rvj 0lo
2
@nasimjahednia 查找CORS...你正在尝试访问的服务器需要允许来自您域名的跨站点脚本。 - Langdon
1
我有点困惑。难道没有办法获取返回的HTTP错误代码吗?这里有很多不同的情况(415、404等)? - Edwin Evans
1
@EdwinEvans 在这些情况下,由于服务器从未响应,因此不存在HTTP响应代码。 - Alex
显示剩余2条评论

9

1
在这种情况下,Chrome目前会将请求保持在“停滞”状态,直到超时。这可能是由于之前从该服务器返回的Strict-Transport-Security标志引起的,也可能是由于发送请求的cookie上存在Secure/HttpOnly标志引起的。 - Shane Hughes

9

在使用<button onclick="">submit</button>时遇到了同样的问题。之后通过使用<input type="button" onclick="">解决了这个问题。


2
哇!有人能解释一下为什么吗? - Jorge
4
默认情况下,HTML按钮的类型是“submit”,因此单击按钮将尝试提交表单数据。它将执行点击操作,然后尝试提交。 如果你使用类型“button”,它将不再是默认类型,并且仅执行 onclick 操作。 - Christophe Roussy

7
重要提示:即使在由带有特定域前缀“www”的cookie定义的会话中,ajax调用也可能失败。如果您在URL中没有www前缀的情况下调用php脚本,则调用将失败,反之亦然。请注意不要删除HTML标签。

4
我发现另一个情况,当XMLHttpRequest未定义时,jquery会给出状态码0。显然,在Web上通常不会出现这种情况,但在我编写的插件中,夜间火狐版本中的一个错误导致了这个问题的出现。 :)

1
你说得对,我在使用jQuery.ajax() XHR对象时遇到了问题。在AJAX调用中甚至没有创建请求,仍然出现f.open不是函数和状态码0的错误。原因是:我从$.ajaxSetup({xhr})返回了$.ajaxSettings.xhr对象,而返回new window.XMLHttpRequest();则解决了这个问题。 - klimpond

4

因为当你搜索ajax状态码0时,这个问题会出现,所以我想留下一些提示,因为这让我浪费了几个小时的时间……我正在使用ajax调用一个PHP服务,这个服务恰好是Phil的Codeigniter REST_Controller(不确定是否与此有关),我一直收到状态码0、读取状态码0,并且这让我疯狂。我在调试它并注意到当我回显和返回消息而不是退出时,我会得到一个成功的结果。最后,我关闭了调试模式并尝试了一下,它起作用了。似乎PHP中的xDebug调试器会修改响应。如果你正在使用PHP调试器,请尝试关闭它以查看是否有帮助。


4

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


黎明,我讨厌我又被这个问题卡住了!<form onsubmit="return false;">解决了这个问题。 - Heitor

3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接