【问题标题】:HTTP Cache-ControlHTTP 缓存控制
【发布时间】:2011-01-22 11:19:22
【问题描述】:

我是 HTTP 缓存的新手,真的需要一些帮助......

  1. 我看到很多人在向服务器发送 XHR 时设置了"Cache-Control" 标头。 这样做的目的是什么?请求头也需要缓存吗?

  2. 我已经为 XHR 设置了这个标题: Cache-Control max-age=30, must-revalidate,但 30 秒后刷新(甚至强制刷新)时,Firefox 3.6.13 似乎不会重新验证文件。也没有访问登录服务器。这是因为我没有为 Apache 中的文件设置过期标头吗?

    来自 Firebug 日志:

    响应标头
    日期 2011 年 1 月 22 日星期六 09:59:21 GMT
    最后修改时间 2011 年 1 月 20 日星期四 09:05:11 GMT
    电子标签“3e000000023ca7-20d-49a436e5b3413”

    请求标头
    保活 115
    连接保持活动
    内容类型应用程序/xml
    Cache-Control max-age=30,必须重新验证

    文件已被修改,但 Firefox 甚至不做条件获取。 Response DateLast-Modified 根本没有更新。

【问题讨论】:

    标签: javascript firefox http-headers cache-control xmlhttprequest


    【解决方案1】:

    客户端也可以发送 Cache-Control 指令。看: https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-p6-cache-12#section-3.2

    不幸的是,当 XHR 设置时,浏览器不会(还)支持它们,但干预代理缓存通常会。

    【讨论】:

    • 是的,客户端也可以发送缓存控制指令,但根据 IETF 文档(和 Mozilla 的文档),必须重新验证不是客户端可以设置的指令之一,所以答案是正确的“服务器需要设置重新验证指令,而不是客户端”。但我同意,如果他们还说 max-age 可以由客户设置,那将很有用。我不确定哪些浏览器版本可以,也不能在客户端使用它们;最好在服务器上设置所有内容。 (另请参阅 Chrome 35 中修复的 Chromium 问题 333804:它仍然会影响 Android 4.4 应用中的 WebView 组件。)
    【解决方案2】:

    服务器需要设置重新验证指令,而不是客户端。

    源控制内容是否以及如何缓存或不缓存,客户端决定是否尊重它。

    must-revalidate 只是意味着发送了一个头请求,如果 etag 不同,则刷新资源。对于大文件来说,这是一种非常常见但不明智的做法,因为电子标签通常会随着内容的变化而变化。

    但是,对于小文件,您可能希望根本没有任何请求,但需要更短的超时时间。那么 must-revalidate 是错误的。 服务器负载和它对 7kb 图像的头部请求所消耗的时间并不比提供完整图像少多少。

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 1970-01-01
      • 2011-02-25
      • 2017-06-01
      • 1970-01-01
      • 2020-09-22
      • 2013-06-27
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多