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

Jas*_*att 5 safari xmlhttprequest mobile-safari sencha-touch

摘要:Safari报告304响应,即使它在XHR请求上收到200响应

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

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

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

200

  • 访问控制允许的凭据:真
  • 访问控制允许报头:*
  • 访问控制允许的方法:GET,POST,UPDATE,DELETE,OPTIONS
  • 访问控制允许来源:未定义
  • 内容长度:2
  • 内容类型:应用/ JSON; 字符集= utf-8的

304

  • 内容类型:text/JavaScript的
  • 最后修改时间:2011年11月20日星期日格林威治标准时间22:30:45
  • 服务器:lightnode
  • 传输编码:身份

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

其他几点说明

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

版本

  • Safari:5.1.1
  • OSX:10.7.2

Ram*_*eya 0

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

此重定向是在浏览器级别处理的,因此您对此无能为力(我过去曾尝试过但无法对此执行任何操作)。

顺便说一句,这不是 sencha 问题,而是 Ajax 的行为方式问题。

希望能帮助到你