浏览器缓存里, 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-Control | Etag / If-None-Match |
---|---|---|
地址栏回车 | yes | yes |
页面链接跳转 | yes | yes |
新打开窗口 | yes | yes |
前进后退 | yes | yes |
F5 | 无效 | yes |
Ctrl+F5 | 无效 | 无效 |