HTTP Cache Control max-age,必须重新验证

nyb*_*nyb 71 http cache-control http-headers

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

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

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

jam*_*iss 54

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

Cache-Control "max-age=3600, must-revalidate"
Run Code Online (Sandbox Code Playgroud)

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

b)客户应重新验证.它可能重新验证使用If-MatchIf-None-Match头部有一个ETag,或者可能使用If-Modified-SinceIf-Unmodified-Since头部与日期.

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

Mar*_*pel 6

A。查看此页面上的 \xe2\x80\x98Stats\xe2\x80\x99 选项卡,看看会发生什么。

\n\n

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

\n\n

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

\n