Cache-Control: must-revalidate是强制要求验证所有请求,还是只验证过期的请求?

7
我对这个头部有些困惑,我看到Cache-Control: must-revalidate强制要求验证所有请求的源,然后再提供缓存项目。但是这些只是旧的吗?或者是所有无论新鲜还是陈旧的内容都需要验证?在不同的地方,我读到了两种不同的解释。
那么Cache-Control: no-cache有什么不同呢?因为这些头看起来对我来说是等价的。
更新1:我从一本书中读到了这个:
Cache-Control: must-revalidate响应头告诉缓存绕过新鲜度计算机制并在每次访问时重新验证:”
@Peter O.指出了RFC的说法,所以那本旧书是错的。
更新2:在这个教程中:http://www.mnot.net/cache_docs/ no-cache — 强制缓存在发布缓存副本之前将请求提交给源服务器进行验证,每次都是如此。这对于确保认证得到尊重(与公共组合使用),或者保持严格的新鲜度而又不牺牲所有缓存的好处非常有用。 must-revalidate — 告诉缓存必须遵守您提供的有关表示的任何新鲜度信息。HTTP允许在特殊条件下提供陈旧的表示;通过指定此标头,您告诉缓存希望严格遵循您的规则。
1个回答

11

HTTP/1.1的第14.9.4节:

当响应中包含must-revalidate指令且被缓存接收到时,缓存在未经重新验证与原始服务器之前不能使用过期的条目来响应后续请求。

HTTP/1.1的第14.8节:

如果响应包括"must-revalidate"缓存控制指令,则缓存可以在回复后续请求时使用该响应。但是,如果响应已过期,则所有缓存必须首先通过与原始服务器重新验证来重新验证它...

因此,只有当接收到must-revalidate时,才需要重新验证过期的响应。

有关no-cache,请参见第14.9.1节:

如果no-cache指令没有指定字段名称[这里就是这种情况],则缓存必须在与原始服务器成功重新验证之前,不得使用响应来满足后续请求...

因此,no-cache适用于新鲜和过期的响应。

编辑:

这句话可能与此相关(第13.3节):

当缓存有一个过期的条目,并希望将其用作响应客户端请求时,它首先必须检查原始服务器(或可能是具有新响应的中间缓存)以查看其缓存的条目是否仍可用。因此,当缓存具有中间缓存时,must-revalidate 可能是相关的,否则缓存可以直接检查中间缓存以获取新响应,而不必直接检查原始服务器。

谢谢。我已经更新了帖子,加入了我在一本书中读到的内容,因为我无法在评论中发布,这与您在RFC上发现的相反。你觉得呢? - vtortola
好的,这本书错了。在那本书的新版本中它说了你说的话。谢谢! - vtortola
2
我还是有些困惑。我想要缓存我的资源,但当服务器上的资源更新到新版本时除外。我读过 no-cache 是为此而设计的,但某些浏览器将其用作 no-store。那么现在我该如何实现这种行为呢?我能使用 must-revalidate 吗? - Didier A.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接