Safari 7.0间歇性Ajax故障

Safari 7.0 Intermittent Ajax Failures

本文关键字:Ajax 故障 0间 Safari      更新时间:2023-12-14

使用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%(大概)的请求中。其他浏览器从未出现过这种情况。这是该应用程序的一个非常关键的部分,所以我一直在尝试一系列解决方案,以解决我认为是浏览器错误的问题,但尚未找到任何此类问题的报告。

尝试修复

尝试修复但未成功:

  • 最初,页面的GETPOSTURL是相同的,所以我尝试在其他地方发布请求
  • 我尝试将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。