最近,我发现我们的网络应用发送了以下标头:
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
吗?
答案 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缓存非常有见地。