小编典典

Cache-Control: max-age=0 和 no-cache 有什么区别?

all

标头Cache-Control: max-age=0暗示内容立即被认为是陈旧的(并且必须重新获取),这实际上与Cache-Control: no- cache.


阅读 109

收藏
2022-03-03

共1个答案

小编典典

我有同样的问题,并在我的搜索中找到了一些信息(您的问题作为结果之一出现)。这是我确定的…

Cache-Control标题有两个方面。一方面是网络服务器(又名“源服务器”)可以发送它的地方。另一边是浏览器可以发送的地方(又名“用户代理”)。


当由源服务器发送时

我相信max-age=0只是告诉缓存(和用户代理)响应从一开始就已经过时,因此他们 应该 在使用缓存副本之前重新验证响应(例如使用If- Not-Modified标头),而no-cache告诉他们 必须 在使用缓存之前重新验证复制。从14.9.1
什么是可缓存的

无缓存

…缓存不得使用响应来满足后续请求,而无需与源服务器成功重新验证。这允许源服务器阻止缓存,即使缓存已配置为向客户端请求返回陈旧响应。

换句话说,缓存有时可能会选择使用陈旧的响应(尽管我相信他们必须随后添加Warning标头),但no- cache表示无论如何都不允许使用陈旧的响应。当棒球统计数据在页面中生成时,您可能想要 SHOULD -revalidate
行为,但是当您生成对电子商务购买的响应时,您会想要 MUST -revalidate 行为。

尽管当您说不no-cache应该阻止存储时,您的评论是正确的,但在使用no-cache. 我遇到了一个页面,Cache Control
Directives
Demystified
,上面写着(我不能保证它的正确性):

实际上,IE 和 Firefox 已经开始将 no-cache
指令视为指示浏览器甚至不缓存页面。我们大约在一年前开始观察这种行为。我们怀疑此更改是由广泛(且不正确)使用该指令来防止缓存引起的。

请注意,最近,“cache-control: no-cache”也开始表现得像“no-store”指令。

顺便说一句,在我看来,这Cache-Control: max-age=0, must-revalidate应该与Cache-Control: no- cache. 所以也许这是一种获得 MUST -revalidate 行为的方法no-cache,同时避免明显迁移no- cache到做同样的事情no-store(即没有任何缓存)?


当由用户代理发送时

我相信shahka的回答适用于用户代理方面。您还可以查看13.2.6
Disambiguating MultipleResponses

如果用户代理发送带有Cache-Control: max- age=0(又名“端到端重新验证”)的请求,那么沿途的每个缓存都将重新验证其缓存条目(例如,使用If-Not- Modified标头)一直到源服务器。如果回复为 304(未修改),则可以使用缓存的实体。

另一方面,发送带有Cache-Control: no-cache(又名“端到端重新加载”)的请求不会重新验证,并且服务器在响应时 不得
使用缓存副本。

2022-03-03