Safari 7.0间歇性Ajax失败

时间:2013-11-29 00:44:15

标签: javascript jquery ajax safari

使用适用于Mac OS X 10.9 Mavericks的Safari 7.0(特别是9537.71),我工作的Web应用程序开始通过jQuery对Ajax请求进行间歇性故障。这绝不是我能用Safari 7.0重现的东西。

环境:

  • Rails 4.0.0(也是4.0.1)
  • jQuery Rails 3.0.4
  • jQuery 1.10.2

请求详细信息:

  • 使用UJS
  • 使用SSL
  • 不跨域
  • 传递给ajax:beforeSend UJS事件are here的设置。

间歇性错误

请求失败时触发了ajax:error UJS事件。错误消息为SyntaxError: JSON Parse error: Unexpected EOF。 XHR的准备状态为4,响应为空,状态为200。有indication这是由于浏览器拒绝了请求,因为它不符合同源策略。这与我在服务器端看到的一致 - 没什么。没有遇到遇到此错误的客户端IP的匹配请求; AJAX请求从未进入服务器。与此相关的同源策略的观点相反,这些请求是相对于主机(/some/url)进行的,因此绝对不应该失败同源策略测试&不应受跨域规则的约束。此外,如果这与跨域问题有关,则会出现一致的失败。有趣的是,对于某些用户来说,这似乎是一致的,但是有些用户会重新尝试并且事情会在以后正常运行。

此问题发生在使用此特定版本的Safari的约30%(球场)请求中。它从未发生在任何其他浏览器上。这是应用程序的一个非常关键的部分,所以我一直在尝试一些解决方法,我假设是一个浏览器错误,但尚未找到任何关于此类问题的报告。

尝试修复

尝试修复但没有成功:

  • 最初页面的 GET POST 网址是相同的,所以我尝试将请求发布在其他位置。
  • 我尝试改为使用URL绝对。

这些尝试修复没有改变任何内容。

此外,在诊断此问题时,我使用基本的AJAX请求将错误发布回服务器,并更好地报告正在发生的事情。我注意到其中一些请求也失败了(部分错误报告仍然有助于排除故障)。总的来说,它似乎与Rails,jQuery或UJS没有任何直接关系。

JSONP解决方案?

最后,我今天将请求切换为使用JSONP,并且非常成功。有一次失败,但失败可能是出于其他原因(仍在调查中)。

问题

我的问题:

  • 是否有任何已知的这种情况发生?
  • 除了浏览器错误(我忽略了什么)之外,还有其他解释吗?

我也会向WebKit小组提交错误报告,但是想在这里询问以防万一有任何想法。

1 个答案:

答案 0 :(得分:0)

将我的网络服务器从Lighttpd 1.4.26 更新为 1.4.33 解决了这个问题。

问题似乎出现在网络服务器上。我不知道它是否是服务器中的错误(我没有找到任何报告),但我能够通过运行最小配置并发送 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。