【问题标题】:Browser returning wrong content in case of HTTP 304浏览器在 HTTP 304 的情况下返回错误的内容
【发布时间】:2014-04-27 04:39:18
【问题描述】:

以下测试用例导致 Chrome 34.0.1847.116m 和 Firefox 28 在收到 HTTP 304 后返回(我认为是)不正确的响应。

  1. 客户端使用Accept: text/html请求GET http://example.com/companies/1/
  2. 服务器返回表示 A 和一些标头。
  3. HTML 中的 Javascript 导致客户端使用 Accept: application/vnd.com.mycompany.something+json; version=1 请求 GET http://example.com/companies/1/
  4. 服务器返回表示B 和不同的标头。
  5. 现在...按 F5 重新加载页面。
  6. 重复步骤 1-4,除了服务器为所有请求返回 HTTP 304
  7. 第 1 步返回 A 和第一组标头,如预期的那样,但第 4 步返回 A 和第一组标头,这是出乎意料的。

意思是,尽管请求Accept 已更改,浏览器仍返回相同的缓存响应(正文和标头)。我期待最后一个请求返回 B 和第二组标头。

我做错了吗?或者这是 Chrome 和 Firefox 中的错误?

【问题讨论】:

  • 服务器是否发送Vary: Accept
  • @BorisZbarsky,你成功了。实际上,几分钟前我通过阅读tools.ietf.org/html/draft-ietf-httpbis-p6-cache-26#section-4.1 独立地解决了这个问题。请发布正式答案,我会将其标记为已接受。
  • 完成。 Vary 的处理当然比每个人都遵循规范更混乱...... :(

标签: google-chrome http rest firefox


【解决方案1】:

回答我自己的问题:

根据https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-p6-cache-26#page-6https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-p6-cache-26#section-4.1,如果响应需要协商,服务器必须返回Vary 标头。此标头指示协商过程中涉及哪些标头。没有此标头意味着响应纯粹基于 URI。

就我而言,返回 Vary: Accept 解决了问题。

【讨论】:

    【解决方案2】:

    仅作记录:

    从技术上讲,如果响应取决于请求标头,则服务器需要在响应中发送相应的 Vary 标头,以便缓存知道将这些请求标头包含在缓存键中。

    实际上,浏览器在缓存键中自动包含一些标头以解决损坏的服务器(例如,很少有服务器发送Vary: Cookie,即使它们应该发送),但Content-Type 不是通常被滥用的标头,因此浏览器不要在那里做任何特别的事情。

    【讨论】:

      猜你喜欢
      • 2011-02-06
      • 2021-01-13
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      相关资源
      最近更新 更多