同时使用“ Expires:0”,“ no-cache”,“ no-store”,“ max-age = 0,必须重新验证”-做什么用?

时间:2018-06-21 16:02:44

标签: http caching

最近,我发现我们的网络应用发送了以下标头:

    Expires: 0
    Cache-Control: no-cache, no-store, max-age=0, must-revalidate

这是我的阅读方式:

    Expires: 0

“嘿,浏览器,您刚刚获得的资源已经过期”

    Cache-Control: [..] max-age=0 [..]

“实际上没关系我刚才所说的,请执行以下操作:”

    no-cache

“请缓存此资源。但是它已经过时,因此请在使用前重新验证”。

    no-store

“也请不要缓存任何内容”

    max-age=0, must-revalidate

“还请缓存此资源。但是,如果您想在0秒后使用它-请重新验证它。”

对此可以有2种解释:

  • 写这篇文章的人不知道自己在做什么
  • 他们实际上非常了解。即他们迎合了一些极端情况下的浏览器行为/错误/我所缺少的东西。

他们到底想避免什么?

奖金问题1:我的理解是否正确,Expires: 0等同于no-cache而不是no-store(带有警告)?即它允许缓存,但是缓存立即变得陈旧-它不会阻止缓存?

奖金问题2:我不应该添加proxy-revalidate吗?

1 个答案:

答案 0 :(得分:2)

缓存是HTTP协议的可选功能,它在RFC 7234中定义。 Cache-Control标头用于为请求/响应链中的缓存指定指令。

根据Mozilla的MDN Web Docs,您可以使用以下Cache-Control指令来关闭HTTP / 1.1中的缓存:

Cache-Control: no-cache, no-store, must-revalidate

使用上述Cache-Control指令时,设置为max-age的{​​{1}}指令是无关紧要的(但这并不有害)。


如果收件人不支持0,则可能还需要添加一个Expires标头设置为0。来自RFC 7234

  

如果响应包含带有Cache-Control指令的Cache-Control字段,则接收者必须忽略max-age字段。同样,如果响应中包含Expires指令,则共享缓存接收者必须忽略s-maxage字段。在这两种情况下,Expires中的值仅适用于尚未实现Expires字段的收件人。


Cache-Control指令的工作方式与proxy-revalidate相同,但是它仅适用于共享缓存(例如代理)。也就是说,缓存必须在使用之前验证过时资源的状态,并且不应使用过期的资源。


我发现article关于Google的HTTP缓存非常有见地。