标头Cache-Control: max-age=0
意味着该内容立即被认为是陈旧的(必须重新获取),实际上与Cache-Control: no-cache
。
我遇到了同样的问题,并在搜索中找到了一些信息(您的问题作为结果之一出现)。这就是我确定的...
Cache-Control
标头有两个方面。一侧是可以由 Web 服务器(也称为 “原始服务器”)发送的位置。另一端是可以由浏览器(也称为 “用户代理”)发送的位置。
我相信max-age=0
只是告诉缓存(和用户代理)响应从一开始就是陈旧的,因此他们应该在使用缓存副本之前重新验证响应(例如,使用If-Not-Modified
, no-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 缓存博客文章。