缓存控制:必须重新验证是否有义务验证所有请求,或仅仅是陈旧的请求?

时间:2011-09-27 17:47:07

标签: http caching http-caching

我对此标题感到困惑,我已经读过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 个答案:

答案 0 :(得分:10)

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可能是相关的 缓存,因为否则缓存可以检查中间缓存的a 新的响应,而不是直接检查原始服务器。