协慌网

登录 贡献 社区

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

标头Cache-Control: max-age=0意味着该内容立即被认为是陈旧的(必须重新获取),实际上与Cache-Control: no-cache

答案

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

Cache-Control标头有两个方面。一侧是可以由 Web 服务器(也称为 “原始服务器”)发送的位置。另一端是可以由浏览器(也称为 “用户代理”)发送的位置。


由原始服务器发送时

我相信max-age=0只是告诉缓存(和用户代理)响应从一开始就是陈旧的,因此他们应该在使用缓存副本之前重新验证响应(例如,使用If-Not-Modifiedno-cache告诉他们在使用缓存的副本之前必须重新验证。14.9.1 开始是可缓存的

无缓存

... 如果未与原始服务器成功进行重新验证,则缓存不得使用响应来满足后续请求。这样,即使已配置为将陈旧的响应返回给客户端请求的缓存,原始服务器也可以防止缓存。

换句话说,缓存有时可能会选择使用陈旧的响应(尽管我认为他们必须随后添加Warning标头),但是no-cache表示无论如何都不允许使用陈旧的响应。在页面中生成棒球统计信息时,您可能希望应该-revalidate 行为,但是在生成对电子商务购买的响应时,您可能希望必须 - 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 。因此,也许这是一种获得no-cache的 MUST -revalidate 行为的方法,同时又避免了no-cache到执行与no-store相同的操作(即无缓存)的明显迁移?


由用户代理发送时

我相信shahkalpesh 的答案适用于用户代理方。您也可以查看13.2.6 消除多个响应的歧义

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

另一方面,使用Cache-Control: no-cache (也称为 “端到端重新加载”)不会重新生效,并且服务器在响应时一定不要使用缓存的副本。

最大年龄 = 0

这等效于单击Refresh ,这意味着给我最新的副本,除非我已经拥有最新的副本。

无缓存

这是在按住Shift 的同时单击 “刷新”,这意味着无论如何都可以重做所有操作。

现在是一个老问题,但是如果其他人像我一样通过搜索遇到此问题,则似乎 IE9 将在使用后退和前进按钮时利用此来配置资源的行为。当使用max-age = 0 时,浏览器将在后退 / 前进时查看资源时使用最新版本。如果使用无缓存,则将重新获取资源。

有关 IE9 缓存的更多详细信息,请参阅此msdn 缓存博客文章