Safari 7.0间歇性Ajax故障
Safari 7.0 Intermittent Ajax Failures
使用Safari 7.0 for Mac OS X 10.9 Mavericks(特别是9537.71)时,我使用的一个web应用程序开始间歇性地通过jQuery处理Ajax请求。这从来都不是我能够用Safari7.0重现的东西。
环境:
- 轨道4.0.0(也是4.0.1)
- jQuery Rails 3.0.4
- jQuery 1.10.2
请求详细信息:
- 使用UJS
- 使用SSL
- 不跨域
- 传递给
ajax:beforeSend
UJS事件的设置如下
间歇性错误
请求失败时触发了ajax:error
UJS事件。错误消息为SyntaxError: JSON Parse error: Unexpected EOF
。XHR将具有4
的就绪状态以及空响应和200
的状态。有迹象表明,这是由于浏览器拒绝了请求,因为它不符合同源策略。这与我在服务器端看到的一致—没有什么遇到此错误的客户端IP没有匹配的请求;AJAX请求从未到达服务器。然而,与这与同源策略有关的想法相反,这些请求是相对于主机(/some/url
)提出的,因此它绝对不应该通过同源策略测试&不应受制于跨域规则。此外,如果这与跨域问题有关,则会出现一致的故障。有趣的是,这种情况似乎一直发生在某些用户身上,但也有他们重新尝试的情况,后来一切都正常。
这个问题发生在这个特定版本Safari的大约30%(大概)的请求中。其他浏览器从未出现过这种情况。这是该应用程序的一个非常关键的部分,所以我一直在尝试一系列解决方案,以解决我认为是浏览器错误的问题,但尚未找到任何此类问题的报告。
尝试修复
尝试修复但未成功:
- 最初,页面的GET和POSTURL是相同的,所以我尝试在其他地方发布请求
- 我尝试将URL设置为绝对URL
这些尝试的修复没有改变任何东西。
此外,在诊断这个问题时,我使用了一个基本的AJAX请求将错误发布回服务器,并更好地报告正在发生的事情。我注意到其中一些请求也失败了(部分错误报告仍然有助于故障排除)。所以总的来说,它似乎与Rails、jQuery或UJS没有任何直接关系。
JSONP解决方案
最后,我今天将请求转换为使用JSONP,并且非常成功。有一次失败,但失败可能是由于其他原因(仍在调查中)。
问题
我的问题:
- 有已知的这种情况发生吗
- 除了浏览器错误(我忽略了什么)之外,还有其他解释吗
我也会向WebKit团队提交一份错误报告,但我想在这里询问一下,以防有人有任何想法。
将我的web服务器从Lighttpd1.4.26更新到1.4.33解决了这个问题。
问题似乎出在web服务器上。我不知道这是否是服务器中的错误(我没有找到任何报告),但我能够通过运行最低限度的配置并向其发送POST请求来重现这个问题。来自表单的简单POST要求无法正确通过web服务器。
这是我运行的安装程序:
Ubuntu 10.04.4 LTS (lucid)
lighttpd/1.4.26 (ssl) - a light and fast webserver
Build-Date: Dec 20 2011 14:45:35
Event Handlers:
+ select (generic)
+ poll (Unix)
+ rt-signals (Linux 2.4+)
+ epoll (Linux 2.6)
- /dev/poll (Solaris)
- kqueue (FreeBSD)
Network handler:
+ sendfile
Features:
+ IPv6 support
+ zlib support
+ bzip2 support
+ crypt support
+ SSL Support
+ PCRE support
+ mySQL support
+ LDAP support
+ memcached support
+ FAM support
+ LUA support
+ xml support
+ SQLite support
+ GDBM support
在构建了Lighttpd的新版本后,我正在运行:
lighttpd/1.4.33 (ssl) - a light and fast webserver
Build-Date: Dec 8 2013 14:06:46
Event Handlers:
+ select (generic)
+ poll (Unix)
- rt-signals (Linux 2.4+)
+ epoll (Linux 2.6)
- /dev/poll (Solaris)
- eventports (Solaris)
- kqueue (FreeBSD)
- libev (generic)
Network handler:
+ linux-sendfile
- freebsd-sendfile
- solaris-sendfilev
+ writev
+ write
- mmap support
Features:
+ IPv6 support
+ zlib support
+ bzip2 support
+ crypt support
+ SSL Support
+ PCRE support
- mySQL support
- LDAP support
- memcached support
- FAM support
- LUA support
- xml support
- SQLite support
- GDBM support
也许这会为其他人节省一些时间,但可能没有多少人还在运行这个旧版本的Lighttpd。
- 无法在通过jQuery的ajax加载的页面中执行javascript
- 如何通过ajax刷新JSF填充的javascript变量
- 如何在php文件中获取$.post-ajax传递的值
- Replacing $ .ajax?
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- Ajax发布表单序列化,发布引号'
- 通过Ajax将JavaScript函数传递给PHP文件
- ajax请求的顺序总是不同的
- 可以't使用Polymer's的核心ajax
- Ajax Live搜索发布到Laravel视图
- Ajax聊天消息重复而不仅仅是更新
- 从控制器返回后Ajax启动事件激发
- Ajax对复杂字符串进行故障切换
- Safari 7.0间歇性Ajax故障
- 多个AJAX请求出现故障
- 对 AJAX XMLHTTP 对象创建进行故障排除
- ajax调用出现故障时的顺序延迟promise
- 用Javascript/Ajax而不是PHP验证表单的防故障方法
- 我怎么能修复故障,其中ajax随机不更新数据
- AJAX:实时函数故障