文章目录
1、介绍
Cache-Control
头信息的取值,决定了如果管理和使用缓存。其在请求和响应中都可以使用
2、取值
1)、缓存请求头信息(以下取值应用于请求头信息中)
指令 | 说明 |
---|---|
no-cache |
可以接收缓存,但需要对缓存做有效性验证 |
no-store |
不能保存或缓存这个请求及对应的响应 |
max-age=秒 |
可以接收有效期内的缓存 |
max-stale=秒 |
可以接收过了有效期,但没过max-stale 的缓存 |
min-fresh=秒 |
可以接收最近xx秒内不过期的缓存 |
no-transform |
指示缓存或代理服务器,不可以更改请求或响应内的媒体数据(比如代理服务器可能会将图片压缩,这个指令可以防止这样的操作) |
only-if-cached |
只要缓存 |
2)、缓存响应头信息(以下取值应用于响应头信息中)
指令 | 说明 |
---|---|
public |
任何人都可以使用这个缓存 |
private |
只有某个人可以使用这个缓存 |
no-cache |
可以使用这个缓存,但使用前必须向服务器做有效性验证 |
no-store |
不得存储这个响应和对应请求的任何内容 |
no-transform |
与请求的no-transform 含义相同 |
must-revalidate |
可以缓存这个响应,但过期后必须向服务器做有效性验证 |
proxy-revalidate |
要求缓存服务器对缓存响应的再次做有效性验证 |
max-age=秒 |
响应的最大有效期 |
s-maxage=秒 |
公共缓存服务器响应的最大有效期 |
3、详细介绍
1)、请求和响应都有的
1.no-cache
Cache-Control:no-cache
- 对于请求来说,该指令的意思是:可以给我缓存,但是这个缓存必须是向服务器验证后证明是有效的。
- 对于响应来说,该指令的意思是:可以缓存这个响应,但使用前必须向服务器做有效性验证
no-store
Cache-Control:no-store
- 对于请求和响应来说,不得以任何形式存储请求或响应的内容
max-age
Cache-Control:max-age=60
- 对于请求来说,可以接收:自响应被发送那一刻开始算起,不超过60秒的缓存
- 对于响应来说,这个响应可以缓存,且有效期为60秒
no-transform
Cache-Control:max-age=60
- 对于请求和响应来说,缓存不能改变其内的媒体类型。例如不能压缩等
2)、请求专用的
max-stale
Cache-Control:max-stale=60
可以接收过了有效期(max-age
指定),但是没过max-stale
的缓存
min-fresh
Cache-Control:min-fresh=60
可以接收在未来60秒内,处于有效期(max-age
指定)的缓存
only-if-cached
Cache-Control:only-if-cached
只接收缓存。如果没有缓存,则返回 504 Gateway Timeout
3)、响应专用的
public
Cache-Control:public
此响应可以被任何中间者缓存
private
Cache-Control:private
此缓存只能被发起请求的客户端缓存
must-revalidate
Cache-Control:must-revalidate
缓存过期后,使用前,必须向服务器做有效性验证。有同学可能在想:缓存过期后不是就得做有效性验证了吗,为啥还专门弄一个指令呢?这时因为,在Http 1.1
规范里,是允许某些情况下直接使用过期缓存的。而加入这个命令,就决不允许使用过期缓存了.具体请看:可能是最被误用的 HTTP 响应头之一 Cache-Control: must-revalidate
再细读规范就知道了,原来 must-revalidate生效的场景还有一个大前提,那就是 HTTP 规范是允许客户端在某些特殊情况下直接使用过期缓存的,比如校验请求发送失败的时候,还比如有配置一些特殊指令(stale-while-revalidate、stale-if-error等)的时候,原文是这样的:
A cache MUST NOT send stale responses unless it is disconnected (i.e., it cannot contact the origin server or otherwise find a forward path) or doing so is explicitly allowed
而must-revalidate的作用就是让那个“unless”失效 ,带有 must-revalidate 的缓存,在任何情况下,都必须成功 revalidate 后才能使用,没有例外。
proxy-revalidate
Cache-Control:proxy-revalidate
与must-revalidate
一致,区别为:这个指令不能作用于私有缓存上。什么是私有缓存?Cache-Control:private
会将缓存存在私有缓存中
s-maxage
Cache-Control:s-maxage=60
与max-age
类似,这里的s
代表共享,并且,这个指令仅用于CDNs或者其他中间者(intermediary caches)。这个指令会覆盖max-age
和expires
响应头
看完了,休息一下,下一节讲Connection
字段,欢迎关注,以获取最新的更新,