HTTP缓存控制的最大使用期限,必须重新验证


72

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

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

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

Answers:


55

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

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

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

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


8
在我看来,该协议在这里有点含糊,但是在实践中,我发现必须重新验证意味着无论最大寿命它都必须重新验证。
ColinM 2012年

3
@ColinM,你是什么意思?must-revalidate意味着只有在达到最大使用期限时才必须重新验证?
Pacerier

7
我称这个答案为“需要引用”。关于它是否正确似乎有一些争论。
andrewrk

19
根据RFC2616 [1],“当高速缓存接收到的响应中存在必须重新验证指令时,该高速缓存必须在其过时后才响应后续请求,而不必先通过原始服务器对其进行验证,则不得使用该条目”这意味着官方规范同意答案,而不是@ColinM。 w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4
andrewrk

4
@ superjoe30我同意根据RFC,答案是正确的。我的评论只是指出,实际上,当存在“必须重新验证”时,某些缓存实际上会忽略“最大使用期限”。不幸的是,我很久以前就进行了这些测试,并且不记得具体进行了哪些测试。总的来说,对于大多数缓存反向代理(nginx,Apache,Cloudfront等)的RFC依从性,我感到非常失望。缺乏对诸如真正的服务器端内容协商之类的支持。
ColinM 2013年

4

一种。查看此页面上的“统计信息”标签,看看会发生什么。

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

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


0

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

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

我有一个静态文件,其中包含“高速缓存控件:public,必须重新验证,最大使用期限= 864000”,Chrome和Firefox每次都发出请求(每次返回304 Not Modified)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.