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— 强制缓存每次在释放缓存副本之前将请求提交给源服务器进行验证。这对于确保尊重身份验证(与 public 结合)或保持严格的新鲜度而不牺牲缓存的所有好处很有用。

must-revalidate— 告诉缓存它们必须遵守您提供给它们的有关表示的任何新鲜信息。HTTP 允许缓存在特殊条件下提供陈旧的表示;通过指定此标头,您是在告诉缓存您希望它严格遵守您的规则。

4

1 回答 1

11

HTTP/1.1第14.9.4节:

当缓存接收到的响应中存在 must-revalidate 指令时,该缓存不能在该条目变得陈旧后使用该条目 来响应后续请求,而无需首先使用原始服务器重新验证它

HTTP/1.1 第 14.8 节:

如果响应包含“必须重新验证”缓存控制指令,缓存可以使用该响应来回复后续请求。但是如果响应是陈旧的,所有的缓存必须首先用原始服务器重新验证它......

must-revalidate因此,如果收到过时的响应,则似乎必须重新验证 。

对于no-cache,请参阅第 14.9.1 节:

如果 no-cache 指令没有指定字段名 [这里就是这种情况],那么缓存不能使用响应来满足后续请求,而无需与源服务器成功重新验证......

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

编辑:

这句话在这里可能是相关的(第 13.3 节):

当缓存有一个陈旧的条目要用作对客户端请求的响应时,它首先必须与源服务器 (或可能带有新响应的中间缓存)检查以查看其缓存条目是否仍然可用.

因此,must-revalidate当缓存具有中间缓存时可能是相关的,因为否则缓存可以检查中间缓存以获取新响应,而不是直接检查源服务器。

于 2011-09-27T18:43:33.300 回答