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

标签 xmlhttprequest sencha-touch mobile-safari safari

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

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

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

header 甚至不正确 - 这是 Safari 针对这两种情况报告的一组不相交的 Response header (我已经确认请求内容和 header 对于两者是相同的):

200

  • Access-Control-Allow-Credentials:true
  • 访问控制允许标题:*
  • 访问控制允许方法:GET、POST、UPDATE、DELETE、OPTIONS
  • 访问控制允许来源:未定义
  • 内容长度:2
  • 内容类型:应用程序/json;字符集=utf-8

  • 304
  • 内容类型:文本/javascript
  • 上次修改时间:2011 年 11 月 20 日星期日 22:30:45 GMT
  • 服务器:lightnode
  • 传输编码:身份

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

    其他一些注意事项
  • 我已经验证服务器发送的响应在每个请求上都是相同的,并且已经对流量进行了 tcpdump 处理并确认服务器正在发送 200 个响应代码(和 header ),然后由 Safari 作为 304 响应报告和处理sans 内容(以及上面的虚假标题。)Safari 报告从未发送过的响应。
  • 上面的 304 header 看起来与此应用程序中可能随静态内容一起发送的内容相似,但我已经确认两个响应都由相同的代码路径提供服务(API 服务器,即不涉及“lightnode”,这些 header 是由 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
  • 最佳答案

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

    这种重定向是在浏览器级别处理的,因此您无能为力(我过去曾尝试过,但无能为力)。

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

    希望能帮助到你

    关于xmlhttprequest - Safari 默默地将 200 个对 AJAX 请求的响应转换为 304s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8546719/

    相关文章:

    javascript - 如何在没有 NavigationView 的情况下处理 sencha 触摸应用程序中的后退按钮?

    php - Sencha Touch 文件上传问题

    css - 三星 Galaxy Tab 中的 Sencha touch Textfield 高亮行为

    javascript - jQuery Mobile 遗漏了 vclick/fastclick 上的 css 效果

    javascript - AJAX 未注意到文件内的更改

    java - 使用 php 打开进程并在请求之间保持打开状态

    httpwebrequest - 如何查看 fiddler 中对我的网站和我的网站 iis 5 的请求

    javascript - Microsoft Edge 阻止跨域请求

    ios - 有没有办法在 iOS9 的状态栏中隐藏 "Back to Safari"?

    css - 在 iframe 中加载响应式网站