header Cache-Control: max-age=0意味着内容被认为是过期的(必须立即重新获取),这实际上与Cache-Control: no-cache是一样的。


当前回答

信息= 0

这相当于单击Refresh,这意味着给我最新的副本,除非我已经有了最新的副本。

no - cache

这是按住Shift同时点击刷新,这意味着,不管发生什么都要重做。

其他回答

在我最近使用IE8和Firefox 3.5进行的测试中,两者似乎都符合rfc。但是,它们对源服务器的“友好性”有所不同。IE8对待无缓存响应的语义与max-age=0相同,必须重新验证。然而,Firefox 3.5似乎将无缓存等同于无存储,这在性能和带宽使用方面都很糟糕。

乌贼缓存,默认情况下,似乎从来没有存储任何无缓存头,就像Firefox。

我的建议是,对于您希望在每个请求上检查新鲜度的非敏感资源,设置public,max-age=0,但仍然允许缓存的性能和带宽优势。对于具有相同考虑的每个用户项目,使用private,max-age=0。

我会完全避免使用无缓存,因为它似乎已经被一些浏览器和流行缓存的功能等同为无存储。

此外,不要模仿Akamai和Limelight。虽然他们本质上把大量缓存数组作为主要业务,而且应该是专家,但他们实际上有既得利益,即从他们的网络下载更多的数据。谷歌可能也不是模拟的好选择。它们似乎根据资源随机使用max-age=0或no-cache。

我不是缓存专家,但Mark Nottingham是。这里是他的缓存文档。他在参考资料部分也有很好的链接。

根据我对这些文档的阅读,它看起来像max-age=0可以允许缓存发送缓存的响应到“同一时间”的请求,其中“同一时间”意味着足够接近,它们看起来与缓存同步,但无缓存不会。

这在MDN文档中直接回答了缓存控制:

大多数HTTP/1.0缓存不支持无缓存指令,所以 历史上max-age=0被用作一种变通方法。但只有 Max-age =0可能会导致在缓存时重用一个陈旧的响应 与源服务器断开连接。必须重新验证才能解决这个问题。 这就是为什么下面的例子等同于无缓存。 Cache-Control: max-age=0,必须重新验证 但是现在,您可以简单地使用无缓存代替。

在MDN文档中也有缓存验证:

It is often stated that the combination of max-age=0 and must-revalidate has the same meaning as no-cache. Cache-Control: max-age=0, must-revalidate max-age=0 means that the response is immediately stale, and must-revalidate means that it must not be reused without revalidation once it is stale — so in combination, the semantics seem to be the same as no-cache. However, that usage of max-age=0 is a remnant of the fact that many implementations prior to HTTP/1.1 were unable to handle the no-cache directive — and so to deal with that limitation, max-age=0 was used as a workaround. But now that HTTP/1.1-conformant servers are widely deployed, there's no reason to ever use that max-age=0-and-must-revalidate combination — you should instead just use no-cache.

信息= 0

这相当于单击Refresh,这意味着给我最新的副本,除非我已经有了最新的副本。

no - cache

这是按住Shift同时点击刷新,这意味着,不管发生什么都要重做。

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

关于IE9缓存的更多细节可以在这篇msdn缓存博客文章中看到。