# 3.1 Cache-Control
> 作者:肖鹏-SpiritLing 时间:2018-05-13
> 通过指定首部字段 `Cache-Control` 的指令,来进行缓存操作的工作机制,多个参数之间可以使用“,”分隔
```http
例:Cache-Control: private,max-age=0,no-cache
```
- `Cache-Control` 指令一览
- 缓存请求指令
| 指令 | 参数 | 说明 |
| ---|--- | --- |
| `no-cache` | 无 | 强制向源服务器再次验证 |
| `no-store` | 无 | 不缓存请求或响应的任何内容 |
| `max-age`=[秒] | 必需 | 响应最大的Age值 |
| `min-fresh`(=[秒]) | 可省略 | 接受已过期的响应 |
| `min-fresh`=[秒] | 必需 | 期望在指定时间内的响应仍有效 |
| `no-transform` | 无 | 代理不可更改类型 |
| `only-if-cached` | 无 | 从缓存获取资源 |
| `cache-extension` | - | 新指令标记(token) |
- 缓存响应指令
| 指令 | 参数 | 说明 |
| ---|--- | --- |
| `public` | 无 | 可向任意方提供响应的缓存 |
| `private` | 可省略 | 仅向特定用户返回响应 |
| `no-cache` | 可省略 | 缓存前必须确认其有效性 |
| `no-store` | 无 | 不缓存请求或响应的任何内容 |
| `no-transform` | 无 | 代理不可更改媒体类型 |
| `must-revalidate` | 无 | 可缓存但必须向源服务器进行确认 |
| `proxy-revalidate` | 无 | 需求中间缓存服务器对缓存的响应有效性再进行确认 |
| `max-age`=[秒] | 必需 | 响应的最大Age值 |
| `s-maxage`=[秒] | 必需 | 公众缓存服务器响应的最大Age值 |
| `cache-extension` | - | 新指令标记(token) |
# 3.1.1 表示是否能缓存的指令
- `public` 指令
```http
Cache-Control: public
```
`public` 意思公共的,表示所有人都可以利用缓存
- `private` 指令
```http
Cache-Control: private
```
`private` 意思私人的,表示响应只以特定的用户作为对象,这与 `public` 指令的行动相反
- `no-cache` 指令
```http
Cache-Control: no-cache
```
`no-cache` 意思是不要过期的缓存资源,表示为了防止从缓存中返回过期的资源
* 客户端发送携带:表示客户端将不会接受缓存过的响应。于是,“中间”的缓存服务器必须把客户端请求转发给源服务器。
* 服务器端发送携带:表示缓存服务器不能对资源进行缓存。源服务器以后也将不再对缓存服务器请求中提出的资源有效性进行确认,且禁止对其响应资源进行缓存操作
```http
Cache-Control: no-cache=Location
```
由服务器返回的响应中,若报文首部字段 `Cache-Control` 中对 `no-cache` 字段名进行具体指定参数值,那么客户端在接受到这个被指定参数值的首部字段对应的响应报文后,就不能使用缓存。换言之,无参数值的首部字段可以使用缓存。只能在响应指令中指定该参数
> 请注意,这里 `no-cache` **不是代表着不缓存,而是代表着,不要过期的缓存**,意思就是说,当请求时,中间缓存服务器会向服务器进行有效期确认,不使用当前缓存的过期资源,也许 `no-cache` 称为 `do-not-serve-from-cache-without-revalidation` 更为恰当
# 3.1.2 控制可执行缓存的对象的指令
- `no-store` 指令
```http
Cache-Control: no-store
```
`store` 意识是仓库,储存,代表着请求(和对应的响应)或响应中包含机密信息,因此,改指令才是真正的不缓存,规定不能缓存在本地存储请求或响应的任一部分
# 3.1.3 指定缓存期限和认证的指令
- `s-maxage` 指令
```http
Cache-Conntrol: x-maxage=604800 (单位:秒)
```
`s-maxage` 指令的功能和 `max-age` 指令相同,它们的不同点就是 `s-maxage` 指令只适用于多位用户使用的公共缓存服务器(一般指代理)。也就是说,对于同一用户重复返回响应的服务器来说,这个指令没有任何作用。另外,当使用 `s-maxage` 指令后,则直接忽略对 `Expires` 首部字段及 `max-age` 指令的处理
- `max-age` 指令
```http
Cache-Control: max-age=604800(单位:秒)
```
当客户端发送的请求中包含 `max-age` 指令时,如果判断缓存资源的缓存时间数值比指定时间的数值更小,那么客户端就接收到缓存的资源。另外,当指定 `max-age` 值为0,那么缓存服务器通常需要将请求转发给源服务器。
当服务器返回的响应中包含 `max-age` 指令时,缓存服务器将不对资源的有效性进行再度确认,而 `max-age` 数字代表资源保存为缓存的最长时间。
应用 `HTTP/1.1` 版本的缓存服务器遇到同时存在Expiress首部字段的情况时,会优先处理 `max-age` 指令,而忽略掉 `Expires` 首部字段。而 `HTTP/1.0` 版本的缓存服务器的情况刚好相反,`max-age` 指令会被忽略。
- `min-fresh` 指令
```http
Cache-Control: min-fresh=60 (单位:秒)
```
`min-fresh` 指令是要求缓存服务器返回至少还未过指定时间的缓存资源。
比如:当指定 `min-fresh` 为60秒时,在这60秒以内如果有超过有效期限的资源都无法作为响应返回了。
- `max-stale` 指令
```http
Canche-Control: max-stale=3600(单位:秒)
```
使用 `max-stale` 可指示缓存资源,即使过期页照常接收。
如果指令未指定参数值,那么无论经过多久,客户端都会接收响应;如果指令中指定了具体的数值,那么即使过期,只要仍然处于 `max-stale` 指定的时间内,仍旧会被客户端接收。
- `only-if-cached` 指令
```http
Cache-Control: only-if-cached
```
使用 `only-if-cached` 指令表示客户端仅在缓存服务器本地缓存目标资源的情况下才会被要求其返回,换言之,该指令要求缓存服务器不重新加载响应,也不会再次确认资源有效性。若发生请求缓存服务器的本地缓存无响应,则返回状态码 504 Gateway Timeout (请求网关超时)
- `must-revalidate` 指令
```http
Cacnhe-Control: must-revalidtae
```
使用 `must-revalidtae` 指令,代理会向源服务器再次验证即将返回的响应缓存目前是否依然有效。
若代理无法连通源服务器再次获取有效资源的话,缓存必须给客户端一条 504 Gateway Timeout (请求网关超时)状态码。
另外,使用 `must-revalidtae` 指令会忽略请求的 `max-stale` 指令(即使已经在首部使用了 `max-stale` ,也不会再有效果)。
- `proxy-revalidate` 指令
```http
Cacnhe-Control: proxy-revalidtae
```
`proxy-revalidtae` 指令要求所有的缓存服务器在接收到客户端带有该指令的请求返回响应之前,必须再次验证缓存的有效性。
- `no-transform` 指令
```http
Cacnhe-Control: no-transform
```
使用 `no-transform` 指令规定无论是在请求还是响应中,缓存都不能改变实体主体的媒体类型。
这样可以防止缓存或代理压缩图片等类似操作。
- **`Canche-Control` 扩展**
- `cache-extension token`
```http
Cache-Control: private,community="UCI"
```
通过 `cache-extension` 标记(`token`),可以扩展 `Cache-Control` 首部字段内的指令。
如上例,`Cache-Control` 首部字段本身没有 `community` 这个指令。借助 `extension tokens` 实现了改指令的添加。如果缓存服务器不能理解 `community` 这个新指令,就会直接忽略。因此,`extension tokens` 仅对能理解它的缓存服务器来说是有意义的。
> 作者:肖鹏-SpiritLing 时间:2018-05-13
- 首语
- 第一章 HTTP协议及网络基础
- 第二章 协议返回状态码
- 第三章 HTTP通用首部字段
- 第一节 Cache-Control字段
- 第二节 Connection 字段
- 第三节 Date 字段
- 第四节 Pragma 字段
- 第五节 Trailer 字段
- 第六节 Transfer-Encoding 字段
- 第七节 Upgrade 字段
- 第八节 Via 字段
- 第九节 Warning 字段
- 第四章 HTTP请求首部字段
- 第一节 Accept 字段
- 第二节 Accept-Charset 字段
- 第三节 Accept-Encoding 字段
- 第四节 Accept-Language 字段
- 第五节 Authorization 字段
- 第六节 Expect 字段
- 第七节 From 字段
- 第八节 Host 字段
- 第九节 If-Match 字段
- 第十节 If-Modified-Since 字段
- 第十一节 If-None-Match 字段
- 第十二节 If-Range 字段
- 第十三节 If-Unmodified-Since 字段
- 第十四节 Max-Forwards 字段
- 第十五节 Proxy-Authorization 字段
- 第十六节 Range 字段
- 第十七节 Referer 字段
- 第十八节 TE 字段
- 第十九节 User-Agent 字段
- 第五章 HTTP响应首部字段
- 第一节 Accept-Ranges 字段
- 第二节 Age 字段
- 第三节 ETge 字段
- 第四节 Location 字段
- 第五节 Proxy-Authenticate 字段
- 第六节 Retry-After 字段
- 第七节 Server 字段
- 第八节 Vary 字段
- 第九节 WWW-Authenticate 字段
- 第六章 HTTP实体首部字段
- 第一节 Allow 字段
- 第二节 Content-Encoding字段
- 第三节 Content-Language 字段
- 第四节 Content-Length 字段
- 第五节 Content-Location 字段
- 第六节 Content-MD5 字段
- 第七节 Content-Range 字段
- 第八节 Content-Type 字段
- 第九节 Expires 字段
- 第十节 Last-Modified 字段
- 第七章 Cookie相关和其他的首部字段