【问题标题】:HTTP Cache Control max-age, must-revalidateHTTP 缓存控制 max-age, must-revalidate
【发布时间】:2011-02-25 08:22:27
【问题描述】:

我有几个与 Cache-Control 相关的查询。

如果我为静态 html/js/images/css 文件指定 Cache-Control max-age=3600, must-revalidate,并在 HTTP 标头中定义 Last Modified Header:

  1. 浏览器/代理缓存(如 Squid/Akamai)是否一直到源服务器以验证在 max-age 到期之前?或者它会从缓存中提供内容直到 max-age 到期?
  2. 在 max-age 到期(即从缓存中到期)后,是否有 If-Modified-Since 检查或是否从源服务器重新下载内容而不进行 If-Modified-Since 检查?

【问题讨论】:

    标签: http http-headers cache-control


    【解决方案1】:

    给出的答案不正确,至少对于 2019 年的网络浏览器而言。

    “过期后,浏览器将在服务器上检查文件是否已更新”

    我有一个带有“Cache-Control: public,must-revalidate,max-age=864000”的静态文件,Chrome 和 Firefox 每次都会发出请求(并且每次都返回 304 Not Modified)。

    【讨论】:

    • 你确定吗?在 nginx 中设置“Cache-Control: public,must-revalidate,max-age=864000”时,我的 chrome 会得到“来自内存缓存”
    • 我认为这是一个不正确的说法。 MDN says a 304 implicitly happens 用于缓存文件。再往下,它还指出,可能会弹出额外的 304,只是为了在开发工具中显示缓存的结果。 MDN 仍然说 must-revalidate “表明一旦资源变得陈旧,缓存在原始服务器上没有成功验证的情况下不得使用其陈旧副本。”
    【解决方案2】:

    a) 如果服务器包含此标头:

    Cache-Control "max-age=3600, must-revalidate"
    

    它告诉客户端缓存和代理缓存一旦内容过时(超过 3600 秒),它们必须在源服务器重新验证才能提供内容。这应该是缓存系统的默认行为,但must-revalidate 指令使此要求明确。

    b) 客户端应重新验证。它可能使用带有 ETag 的 If-MatchIf-None-Match 标头重新验证,或者它可能使用带有日期的 If-Modified-SinceIf-Unmodified-Since 标头。

    【讨论】:

    • 对我来说,协议在这里有点模棱两可,但在实践中我发现 must-revalidate 意味着它必须重新验证,无论 max-age 是多少。
    • @ColinM,你是什么意思? must-revalidate 表示只有在达到 max-age 时才必须重新验证?
    • 我在这个答案上称“需要引用”。关于它是否准确似乎存在一些争论。
    • 根据 RFC2616[1],“当缓存接收到的响应中存在 must-revalidate 指令时,该缓存在 变得陈旧后不得使用条目响应后续请求而无需先使用原始服务器重新验证它”这意味着官方规范同意答案,而不是@ColinM。 w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4
    • @superjoe30 我同意根据 RFC 的答案是正确的。我的评论只是指出在实践中,当存在“must-revalidate”时,一些缓存基本上会忽略“max-age”。不幸的是,我很久以前就进行了这些测试,不记得具体是哪些。总的来说,我对大多数缓存反向代理(nginx、Apache、Cloudfront 等)遵守 RFC 感到非常失望,尤其是在缺乏对真正的服务器端内容协商之类的支持。
    【解决方案3】:

    一个。查看this page 上的“统计”标签,看看会发生什么。

    b.到期后,浏览器将在服务器上检查文件是否已更新。如果没有,服务器将响应 304 Not Modified 标头并且不会下载任何内容。

    您可以通过查看 Firebug 或类似工具中的“网络”面板自行检查此行为。只需在地址栏中重新输入 URL,然后将 HTTP 请求数与缓存为空时的请求数进行比较即可。

    【讨论】:

      猜你喜欢
      • 2018-11-24
      • 2017-07-16
      • 2019-01-17
      • 2018-05-08
      • 2015-12-04
      • 2012-11-21
      • 2015-02-14
      • 2012-12-02
      • 1970-01-01
      相关资源
      最近更新 更多