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



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

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

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

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

200

  • Access-Control-Allow-Credentials:真
  • Access-Control-Allow-Headers: *
  • Access-Control-Allow-Methods: GET、POST、更新、删除,选择
  • Access-Control-Allow-Origin:未定义的
  • 内容长度:2
  • - type: application/json;utf - 8字符集=

304

  • 的content - type: text/javascript
  • 最后修改:星期日,2011年11月20日22:30:45 GMT
  • 服务器:lightnode
  • 传输编码:身份

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

其他注意事项

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

  • Safari: 5.1.1
  • OSX: 10.7.2

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

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

这不是sencha的问题,而是Ajax的行为。

希望有所帮助

最新更新