73

我有几个与 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 检查?
4

3 回答 3

58

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

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

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

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

于 2012-01-04T16:00:58.580 回答
6

一个。查看此页面上的“统计”选项卡,看看会发生什么。

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

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

于 2010-05-31T15:47:56.520 回答
1

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

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

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

于 2019-04-10T18:13:45.333 回答