ChatGPT解决这个技术问题 Extra ChatGPT

HTTP 缓存控制 max-age, must-revalidate

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


j
james.garriss

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

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

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

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


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

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

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

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


m
mhenry1384

给出的答案是不正确的,至少对于 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 “表示一旦资源变得陈旧,缓存在原始服务器上未成功验证的情况下不得使用其陈旧副本。”
在将 must-revalidate 添加到以前只设置了 max-age 的特定文件的缓存策略后,我遇到了这样的情况。问题是浏览器保留了先前请求的旧 If-Modified-Since 值,因此总是检查资源并获得 304 响应。清除我的缓存后,应用了新策略,现在文件按预期直接从内存/磁盘缓存中提供。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅