浏览器缓存里, Cache-Control是金字塔顶尖的规则, 它藐视一切其他设置, 只要其他设置与其抵触, 一律覆盖之.

语法为: “Cache-Control : cache-directive”.
Cache-directive共有如下12种(其中请求中指令7种, 响应中指令 9 种):

cache-directive描述 存储策略 过期策略 请求 响应
Public 资源将被客户端和代理服务器缓存yes yes
Private 资源将被客户端缓存、代理服务器不缓存yes yes
no-sore 请求和相应都不缓存 yes yes yes
no-cache 客户端缓存内容,但是是否使用缓存则需要经过协商缓存来验证决定 yes yes yes yes
max-age 客户端可以接收生存期不大于指定时间(以秒为单位)的响应 yes yes yes yes
s-maxage 覆盖max-age 或者 Expires 头,但是仅适用于共享缓存(比如各个代理),并且私有缓存中它被忽略。 yes yes yes
max-stale 指示客户端可以接收超出超时期间的响应消息 yes yes yes
min-fresh 指示客户端可以接收响应时间小于当前时间加上指定时间的响应。 yes yes
must-revalidate 缓存必须在使用之前验证旧资源的状态,并且不可使用过期资源。 yes yes
proxy-revalidate 与must-revalidate作用相同,但它仅适用于共享缓存(例如代理),并被私有缓存忽略。 yes yes
only-if-cached 表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝 yes
no-transform 不得对资源进行转换或转变 yes yes

假设所请求资源于4月5日缓存, 且在4月12日过期.

当max-age 与 max-stale 和 min-fresh 同时使用时, 它们的设置相互之间独立生效, 最为保守的缓存策略总是有效. 这意味着, 如果max-age=10 days, max-stale=2 days, min-fresh=3 days, 那么:

根据max-age的设置, 覆盖原缓存周期, 缓存资源将在4月15日失效(5+10=15);

根据max-stale的设置, 缓存过期后两天依然有效, 此时响应将返回110(Response is stale)状态码, 缓存资源将在4月14日失效(12+2=14);

根据min-fresh的设置, 至少要留有3天的新鲜期, 缓存资源将在4月9日失效(12-3=9);

由于客户端总是采用最保守的缓存策略, 因此, 4月9日后, 对于该资源的请求将重新向服务器发起验证.
注: 单一计算不会叠加

用户行为对缓存的影响

操作 Expires/ Cache-ControlEtag / If-None-Match
地址栏回车 yes yes
页面链接跳转 yes yes
新打开窗口 yes yes
前进后退 yes yes
F5 无效 yes
Ctrl+F5 无效 无效