【问题标题】:Why are browsers caching requests independent from the content-type?为什么浏览器缓存请求独立于内容类型?
【发布时间】:2014-03-30 17:30:10
【问题描述】:

我有一个可以根据接受的内容类型提供的 URL。当浏览器使用 html 加载该页面时,一切都显示正确。在该页面上,更多内容从带有 application/json 的相同 URL 加载。 使用一个链接,然后通过历史返回到原始页面后,会显示 json 内容。

从 chromium 和 firefox dev utils 我可以看到,他们正在从缓存中加载页面,而不是再次请求它。

这是我发送的所有标头:

Content-Length:72753
Content-Type:text/html; charset=UTF-8

为什么浏览器会独立于内容类型缓存它,有没有办法告诉他们这样做?

更新:看起来像 chromium 中的一个错误,没有得到修复。

更新:@T.J.克劳德的答案是正确的。可变标头解决了 chromium 和 firefox 中的问题。

【问题讨论】:

    标签: html json browser content-type browser-cache


    【解决方案1】:

    如果您允许缓存,则浏览器无法知道如果再次请求内容,您会更改内容类型。

    在我看来,最好的办法是对 HTML 和 JSON 使用不同的 URL,允许将每个 URL 缓存到适合它们的程度。

    如果你真的想为这两种类型使用相同的 URL,理论上 Vary response header 就是为此而设计的。它是缓存内容的一部分,并告诉缓存(浏览器、代理等)请求的哪些部分会影响响应。 This section 也很有帮助。例如,Vary: Accept 会说响应会因Accept 请求标头而异。

    但我会在依赖它之前测试、测试、测试。一般来说,缓存实现是出了名的错误。但我没有关于 Vary 标头相关错误的具体信息。

    【讨论】:

    • 好吧,我用请求者要求的相同内容类型来回答请求。所以同一个请求之间没有任何变化。除此之外,每种内容类型的不同 URL 不会对 REST 起作用吗?
    • 浏览器发送接受头,我可以用它来计算表示。这些 URL 会将表示与资源混合在一起。据我了解,这就是接受标头的用途。但是当浏览器只使用你所说的 URL 时,事情就会变得更加复杂。
    • 我接受您的回答,因为这似乎是目前解决此问题的唯一方法。 Firefox、Chromium 和 Opera 大多忽略生成的内容类型。
    • @Gibheer:在淋浴时我记得Vary 标题,这可能会有所帮助。我不知道我会依赖它,但我没有具体信息说你不应该。我已经用信息和链接更新了答案。
    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2011-06-12
    相关资源
    最近更新 更多