当前位置: 首页 > 知识库问答 >
问题:

no-cache和must-revalidate之间的差异

艾修然
2023-03-14

来自RFC 2616

http://www.w3.org/protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

与之相比

必须-重新验证

当缓存接收到的响应中存在必须重新验证指令时,该缓存在条目过期后不得使用该条目来响应后续请求,而不首先使用原始服务器重新验证该条目

特别是关于no-cache用户代理实际上是这样根据经验对待这个指令的吗?

如果有must-revalidatemax-ageno-cache有什么意义?

请参阅以下评论:

http://palpapers.plynt.com/issues/2008jul/cache-control-attributes/

虽然这个指令听起来像是在指示浏览器不要缓存页面,但这有细微的区别。根据RFC,“no-cache”指令告诉浏览器,在从缓存中提供页面之前,它应该与服务器重新验证。重新验证是一种简单的技术,可以让应用程序节省带宽。如果浏览器缓存的页面没有更改,服务器只需向浏览器发出信号,页面就会从缓存中显示出来。因此,浏览器(至少在理论上)将页面存储在其缓存中,但仅在与服务器重新验证之后才显示它。实际上,IE和Firefox已经开始将no-cache指令视为指示浏览器甚至不要缓存页面。我们大约一年前开始观察这种行为。我们怀疑这一变化是由于广泛(且不正确)地使用该指令来阻止缓存而促使的。

有人有更官方的消息吗?

更新

直到现在我才把这件事放在心上。RFC说不要轻率地使用must-revalidate。问题是,对于web服务,您必须采取负面的观点,并对未知的客户端应用程序假设最坏的情况。任何陈旧的资源都有可能导致问题。

还有我刚才考虑过的其他问题,如果没有最后修改或ETAG,浏览器只能再次获取整个资源。然而,对于ETags,我观察到Chrome至少会对每一个请求进行重新验证。这使得这两个指令都没有意义,或者至少命名不好,因为它们不能正确地重新验证,除非请求还包括其他标头,这些标头会导致“始终重新验证”(always revalidate)。

我只想把最后一点说清楚。只需设置must-revalidate而不包括ETag或Last-Modified,代理就只能再次获取内容,因为它没有任何东西要发送到服务器进行比较。

然而,我的经验测试表明,当响应中包含ETag或修改的头数据时,代理总是重新验证,不管是否存在must-revalidate头。

因此,must-revalidate的作用是在过期时强制执行“绕过缓存”,这只有在您设置了生存期/时间后才会发生,因此,如果在没有时间或其他头的响应上设置了must-revalidate,它实际上就等同于no-cache,因为响应将立即被认为是过期的。

--所以我要最后标记Gili的答案!

共有1个答案

孟彦
2023-03-14

我认为必须重新验证意味着:

一旦缓存过期,拒绝向用户返回过时的响应,即使他们说过时的响应是可以接受的。

no-cache表示:

至少,这是我的解读。

 类似资料:
  • 我正在尝试将Etag特性实现到我的Spring Boot应用程序中,这样浏览器就可以在服务器映像更改时更新映像缓存。 我通过一个YAML文件更改了Spring Boot设置:

  • 我想知道使用子句和之间的性能差异。我从他们两个那里得到了不同的时间。假设我有10个组,我想让一个用户可以访问5个组,同时排除5个组。因此,我有两种使用查询的方式: 我可以在布尔查询中使用子句,并执行。我可以再次在布尔查询中使用子句,并执行。 我在这里没有提供很多细节,因为我只是想更多地了解使用这两个术语的性能差异。我在ES文档中读到了Boolean查询,它说在子句中忽略评分,尽管我还不明白在Luc

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 问题内容: Swing组件具有与屏幕布局更新有关的多种方法,尤其是: validate() invalidate() revalidate() Java文档从技术角度对这些进行了一些定义,但是尚不清楚如何使用它们。 两者之间有什么区别,在什么情况下应使用一种而不是其他方式? 问题答案: 将容器标记为无效。表示内容某种程度上是错误的,必须重新布置。但这只是一种标记/标志。以后可能必须刷新多个无效的容

  • 我编写了一个简单的脚本,它接受任意数量的参数来演示< code>$@和< code>$*之间的区别: 在我做的 CLI 上 这就是打印出来的 因为它们是相同的,这是否意味着等于?还是我遗漏了一点?

  • 在一个示例演示应用程序中,我使用React Native进行网络调用。实际上,React Native使用和作为默认缓存策略。当进行网络调用时,服务返回的响应包含以下缓存控件标头: 基于14.9.4缓存重新验证和重新加载控制部分,这不应该是预期的行为,但也许我错了。 因为高速缓存可以被配置为忽略服务器的指定过期时间,并且因为客户端请求可以包括max-stale指令(具有类似的效果),所以该协议还包