我有几个与 Cache-Control 相关的查询。
如果我为静态 html/js/images/css 文件指定 Cache-Control max-age=3600, must-revalidate
,并在 HTTP 标头中定义 Last Modified Header:
浏览器/代理缓存(如 Squid/Akamai)是否一直到源服务器以在 max-age 到期之前进行验证?或者它会从缓存中提供内容直到 max-age 到期?在 max-age 到期(即从缓存中到期)之后,是否有 If-Modified-Since 检查或者是否从源服务器重新下载内容而不进行 If-Modified-Since 检查?
a) 如果服务器包含此标头:
Cache-Control "max-age=3600, must-revalidate"
它告诉客户端缓存和代理缓存,一旦内容过时(超过 3600 秒),它们必须在源服务器上重新验证才能提供内容。这应该是缓存系统的默认行为,但 must-revalidate
指令使此要求明确。
b) 客户应重新验证。它可能使用带有 ETag 的 If-Match
或 If-None-Match
标头重新验证,或者它可能使用带有日期的 If-Modified-Since
或 If-Unmodified-Since
标头。
一个。查看 this page 上的“统计”标签,看看会发生什么。
湾。到期后,浏览器将在服务器上检查文件是否已更新。如果没有,服务器将使用 304 Not Modified
标头进行响应,并且不会下载任何内容。
您可以通过查看 Firebug 或类似工具中的“网络”面板自行检查此行为。只需在地址栏中重新输入 URL 并将 HTTP 请求数与缓存为空时的请求数进行比较。
给出的答案是不正确的,至少对于 2019 年的网络浏览器而言。
“过期后,浏览器将在服务器上检查文件是否已更新” <- 不正确
我有一个带有“Cache-Control: public,must-revalidate,max-age=864000”的静态文件,Chrome 和 Firefox 每次都会发出一个请求(并且每次都返回 304 Not Modified)。
must-revalidate
“表示一旦资源变得陈旧,缓存在原始服务器上未成功验证的情况下不得使用其陈旧副本。”
must-revalidate
添加到以前只设置了 max-age
的特定文件的缓存策略后,我遇到了这样的情况。问题是浏览器保留了先前请求的旧 If-Modified-Since
值,因此总是检查资源并获得 304 响应。清除我的缓存后,应用了新策略,现在文件按预期直接从内存/磁盘缓存中提供。