header Cache-Control: max-age=0意味着内容被认为是过期的(必须立即重新获取),这实际上与Cache-Control: no-cache是一样的。
当前回答
我不是缓存专家,但Mark Nottingham是。这里是他的缓存文档。他在参考资料部分也有很好的链接。
根据我对这些文档的阅读,它看起来像max-age=0可以允许缓存发送缓存的响应到“同一时间”的请求,其中“同一时间”意味着足够接近,它们看起来与缓存同步,但无缓存不会。
其他回答
这是一个老问题了,但是如果有人像我一样通过搜索发现了这个问题,那么IE9似乎会在使用后退和前进按钮时利用这个来配置资源的行为。当使用max-age=0时,浏览器在向后/向前按下查看资源时将使用最近的版本。如果使用了无缓存,则会重新获取资源。
关于IE9缓存的更多细节可以在这篇msdn缓存博客文章中看到。
在我最近使用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。
我也有同样的问题,在我的搜索中找到了一些信息(你的问题是结果之一)。这是我的决定……
Cache-Control头有两个面。一边是它可以发送的web服务器(aka。“原始服务器”)。另一边是浏览器可以发送数据的地方。“用户代理”)。
当由源服务器发送时
我相信max-age=0只是告诉缓存(和用户代理)响应从一开始就过时了,所以他们应该重新验证响应。使用If-Not-Modified头)在使用缓存副本之前,而no-cache告诉他们在使用缓存副本之前必须重新验证。从14.9.1什么是可缓存的
no - cache ...缓存绝对不能使用响应 满足后续的请求 没有成功的重新验证 源服务器。这允许 源服务器防止缓存甚至 通过已配置为 向客户端返回过时的响应 请求。
换句话说,缓存有时可能会选择使用过时的响应(尽管我认为它们必须添加一个警告标头),但无缓存表示无论如何都不允许使用过时的响应。在页面中生成棒球统计数据时,您可能希望使用SHOULD-revalidate行为,但在生成对电子商务购买的响应时,可能希望使用MUST-revalidate行为。
虽然您在评论中说无缓存不应该阻止存储是正确的,但在使用无缓存时,这实际上可能是另一个区别。我看到一个页面,缓存控制指令解密,上面写着(我不能保证它的正确性):
实际上,IE和Firefox已经做到了 开始处理无缓存 指令就好像它在指令 浏览器甚至不缓存页面。 我们开始观察这种行为 大约一年前。我们怀疑 这一变化是由 广泛的(不正确的)使用 指令防止缓存。 ... 请注意,最近,“cache-control: “无缓存”也开始发挥作用 比如“禁止存放”的指令。
顺便说一句,在我看来,Cache-Control: max-age=0, must-revalidate基本上应该与Cache-Control: no-cache意思相同。因此,也许这是一种获得无缓存的MUST-revalidate行为的方法,同时避免将无缓存迁移到与无存储(即无存储)相同的事情。没有缓存)?
当由用户代理发送时
我相信shahkalpesh的答案适用于用户代理端。你也可以看看13.2.6消除多个响应的歧义。
如果一个用户代理用Cache-Control发送一个请求:max-age=0 (aka。“端到端重新验证”),然后沿途的每个缓存将重新验证其缓存条目(例如。使用If-Not-Modified报头)一直到源服务器。如果回复是304 (Not Modified),则可以使用缓存的实体。
另一方面,发送请求与Cache-Control: no-cache (aka。“端到端重新加载”)不会重新验证,服务器在响应时绝对不能使用缓存副本。
我不是缓存专家,但Mark Nottingham是。这里是他的缓存文档。他在参考资料部分也有很好的链接。
根据我对这些文档的阅读,它看起来像max-age=0可以允许缓存发送缓存的响应到“同一时间”的请求,其中“同一时间”意味着足够接近,它们看起来与缓存同步,但无缓存不会。
One thing that (surprisingly) hasn't been mentioned is that a request can explicitly indicate that it will accept stale data, using the max-stale directive. In that case, if the server responded with max-age=0, the cache would merely consider the response stale, and would be free to use it to satisfy the client's request [which asked for potentially-stale data]. By contrast, if the server sends no-cache that really does trump any request by the client (with max-stale) for stale data, as the cache MUST revalidate.
推荐文章
- 什么是“升级-不安全-请求”HTTP报头?
- 向Angular HttpClient添加一个HTTP头并不会发送这个头,为什么?
- HTTP 301和308状态码有什么区别?
- 什么HTTP状态码应该用于错误的输入
- 编排microservices
- 如何使HTTP请求在PHP和不等待响应
- PATCH和PUT请求的主要区别是什么?
- 我可以把我所有的http://链接都改成//吗?
- 停止缓存jQuery .load响应
- URL为AJAX请求编码一个jQuery字符串
- 编译System.Net.HttpClient的查询字符串
- 摘要认证和基本认证的区别是什么?
- Axios -删除请求与请求体和头?
- 如何在http获取请求设置报头?
- 如何使用Ruby on Rails进行HTTP请求?