Safari默默地将对AJAX请求的200个响应转换为304

时间:2011-12-17 17:53:49

标签: xmlhttprequest sencha-touch mobile-safari safari

摘要:即使在XHR请求中收到200,Safari也会报告304响应

你好 - 我和Safari有一个奇怪的情况,并且已经到了试图自己研究它的路的尽头,我希望有人在这里遇到过这个。

我目前开始在Safari中使用我的应用程序(一个厚厚的Sencha Touch客户端与NodeJS提供的RESTful API交谈)并注意到浏览器偶尔(实际上是:大约5次中有6次)错误处理服务器响应,并将它们(在开发人员工具网络控制台中)报告为没有内容的304响应,而不是实际传递的具有JSON内容的200个响应。 (并且应用程序的行为相应 - 无内容304响应导致应用程序假设它没有数据,并且它以这种方式响应,因此它不仅仅是开发人员面板中的一个外观问题。)

标题甚至不正确 - 这是两种情况下Safari报告的不相交的响应标头集(我已经确认请求内容和标题对于两者是相同的):

200

  • 接入控制允许凭证:真
  • 接入控制允许接头:*
  • 接入控制允许方法:GET,POST,更新,删除,OPTIONS
  • 访问控制允许来源:未定义
  • 的Content-Length:2
  • 内容类型:应用/ JSON;字符集= UTF-8

304

  • 内容类型:文本/ JavaScript的
  • Last-Modified:Sun,2011年11月20日22:30:45 GMT
  • 服务器:lightnode
  • 传送编码:身份

(我省略了两者之间相同的响应头。)

其他一些注释

  • 我已经验证服务器发送的响应在每次请求时都是相同的,并且已经tcpdump了流量并确认服务器正在发送200个响应代码(和标头),然后由Safari报告和处理因为304响应没有内容(以及上面的虚假标题).Safari正在报告从未发送过的响应。
  • 上面的304标题看起来类似于此应用程序中可能与静态内容一起发送的内容,但我已确认两个响应都由相同的代码路径提供(API服务器,即没有涉及“lightnode”,这些标题由Safari组成。)
  • 我在Chrome中看不到这种行为
  • 我在Mobile Safari上确认了相同的错误应用程序行为(为其构建了Sencha Touch,以及所有其他WebKit浏览器,如Safari和Chrome),但无法确认特别是因为iOS没有真正公开这种低级调试信息,所以伪造的响应处理。
  • 此处没有XSS / CORS问题,API和静态内容均来自同一个域。
  • 是的,我已经完成了所有常用的清除cookies / cache / restart / etc初始化的东西,没有效果。

版本

  • Safari:5.1.1
  • OSX:10.7.2

1 个答案:

答案 0 :(得分:0)

伟大的研究工作。你看到的是一个Ajax Redirection&通常你不能在大多数开发人员工具中看到它,但它会发生。理想情况下,它应该对您的应用程序没有影响,在您的问题中我没有看到您报告任何问题或错误只是更多的请求。

这个重定向是在浏览器级别处理的,所以你无能为力(我过去曾尝试过,对此无能为力)。

这不是一个传言问题,而是Ajax的行为方式。

希望有所帮助