Cache-Control是HTTP协议的一部分,是在请求和响应中必须服从的指令,通常用于提高页面加载,阻止页面缓存对请求和响应造成不利的干扰。
Cache-Control 为单向指令,即请求中存在的指令,并不意味着响应中存在同样的指令
客户端对请求的处理(请求头设置的Cache-Control):
Web浏览器都有Refresh(刷新)和Reload(重载)按钮,可以强制对浏览器或者代理缓存,进行刷新
Refresh的特性取决于特定的浏览器、文档以及拦截缓存的配置。可以通过下面的指令来强化客户端的缓存配置
指令 | 目的 |
---|---|
Cache-Control:max-stale=<s> | 缓存可随意提供过期文件,如果指定了参数<s> 在这段时间内,文档不能过期 |
Cache-Control:max-age=<s> | 缓存无法返回缓存时间大于<s>秒的文件,这条指令使得缓存更加严格 |
Cache-Control:no-cache | 除非资源进行了再验证,否则客户端不会接受已经缓存的资源 |
Cache-Control:no-store | 缓存尽快从存储器中删除资源痕迹 |
Cache-Control:only-if-cached | 当缓存中有副本文件存在才,客户端才会获取副本 |
服务器对Cache-Control的配置:
指令 | 说明 |
---|---|
public | 所有内容都被缓存 |
private | 仅客户端缓存代理服务器不缓存 |
no-cache | 必须先与代理服务器确认是否更改,然后在在决定使用缓存还是请求 |
no-store | 所有内容都不会被缓存 |
must-revalidation/proxy-revalidation | 如果缓存内容失效,请求必须发送服务器/代理进行验证 |
max-age=<s> | 缓存内容在s秒后失效,仅HTTP1.1可用 |
对于上述配置浏览器的响应为:
指令 | 打开新窗口 | 原窗口单击Enter按钮 | 刷新 | 点击返回按钮 |
public | 缓存页面 | 缓存页面 | 重新请求页面 | 缓存页面 |
private | 重新请求 | 第一次请求,随后缓存 | 重新请求页面 | 缓存页面 |
no-cache/no-store | 重新请求 | 重新请求 | 重新请求 | 缓存页面 |
must-revalidation/proxy-revalidation | 浏览器重新请求 | 第一次请求,随后缓存 | 重新请求 | 缓存页面 |
max-age=xxx | 在XX秒后重新请求 | 在XX秒后重新请求 | 重新请求 | 在xx秒后重新请求 |
设置缓存之后客户端的请求:
HTTP中expires为绝对过期时间,过期时间过期了,说明缓存已过期,max-age定义了请求返回数据中最大使用使用期。
定义了max-age之后,缓存的内容不一定每次都与服务器来进行验证,但是在过期时间到期之后。一定会与服务器验证。
HTTP条件方法可以实现高效的再验证,向服务发送 “ 条件GET ” 目前最常用的为 If-Modified-Since:Date If-None-Math:ETag(实体标签,版本标识)
If-Modified-Since 表示在指定日期之后资源被更新,就返回新的请求,如果指定日期未更新就返回304直接读取缓存
If-None-Math 有的文档有可能周期性的被重写,通过ETag 来确保文档是否改变,改变返回请求状态为200的新资源,未改变返回状态码304直接读取缓存
这些可以结合使用。
缓存的内容不一定每次都与服务器来进行验证,不同的浏览器对于请求中Cache-Control的值和响应中Cache-Control的值的优先级是不一样的。以下为设置了max-age之后的请求
- win8.1 firefox55 Gecko55.0
- Win7 chrome47 webkit 537.36
- Win7 chrome 45 webkit 537.36 45.0.2454.101
- Win10 chrome 48 webkit 537.36
- Win7 chrome 58 webkit 537.36
- Mac OS 10.12.6 safari10 webkit 603.38
- winXP chrome55 webkit 537.36 55.0.2883.87
- Win7 Maxthon4 4.9.5.1000 webkit537.36