HTTP首部 Cache-Control
Cache-Control:控制缓存的行为
通过指定首部字段 Cache-Control 的指令,就能操作缓存的工作机制;
Cache-Control指令可用于请求及响应时;
指令的参数是可选的,多个指令之间通过“,”分隔。
eg:Cache-Control:private,max-age=0,no-cache
Cache-Control指令一览:
请求指令:
| 指令 | 参数 | 说明 |
|---|---|---|
| no-cache | 无 | 强制向源服务器再次验证 |
| no-store | 无 | 不缓存请求或响应的任何内容 |
| max-age=【秒】 | 必需 | 响应的最大Age值 |
| max-stale(=【秒】) | 可省略 | 接收已过期的响应 |
| 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) |
一、表示是否能缓存的指令
1、public:当指定使用public指令时,则明确表明其他用户也可利用缓存。
Cache-Control:public
在执行private指令时,响应的对象被限定为特定的参与者,并且这种行为与public指令所表现的特点相反。
作为提供资源缓存服务的专门设施,缓存服务器会针对特定用户提供相关服务;当其他客户端发送请求时,代理服务器将不返回任何缓存信息。
作为提供资源缓存服务的专门设施, 缓存服务器会针对特定用户提供相关服务; 当其他客户端发送请求时, 代理服务器将不返回任何缓存信息.
Cache-Control:private
3、no-cache:使用no-cache指令的目的是为了防止从缓存中返回过期的资源
Cache-Control:no-cache
当发送到客户端的请求中包含了no-cache指令时,则表示该请求不会被处理为缓存响应。因此,在缓存层中的服务器必须将该客户端的请求转发给源服务器。
当服务器返回的响应中包含no-cache指令时,缓存服务器将无法对所请求的资源进行缓存处理。随后的源服务器将不会再停止确认请求中的资源有效性,并且明确禁止对其响应资源进行任何形式的缓存操作。
Cache-Control:no-cache=Location
在服务器返回的响应内容中,当缓送头中的Cache-Control字段指定no-cache参数值时,则表示客户端不应利用缓存机制;相反地,在未指定no-cache参数的缓送头仍可采用缓存策略。具体而言,在接收到该缓送头对应的响应内容时(即接收方接收此特定参数值的头部字段),客户端将无法使用缓存机制进行数据存储或重传;只有当响应指令中未设定该特定参数时才允许客户端进行相应的缓存操作。
二、控制可执行缓存的对象的指令
no-store:暗示请求(和对应的响应)或响应中包含机密信息。
Cache-Control:no-store
该指令规定缓存不能在本地存储请求或响应的任一部分。
三、指定缓存期限和认证的指令
1、s-maxage:
Cache-Control:s-maxage=604800(单位:秒)
s-maxage指令的功能与max-age指令类似,在功能上是相同的。它们的主要区别在于s-maxage指令主要针对的是供多个用户共享的公共缓存服务器。也就是说,在向同一用户多次请求响应时该指令不起作用。
此外,在运用 s-maxage 指令时,则不考虑对 Expires 首部字段的处理以及对 max-age 指令的处理。
2、max-age:
Cache-Control:max-age=604800(单位:秒)
若客户端发送请求包含max-age指令,则判断缓存资源的缓存时间是否小于指定时间;此外,在设置max-age值为0时,则通常会将请求转发给源服务器。
当服务器返回响应并包含max-age指令时,在线缓存服务器将不再验证资源的有效性,并采用该指令中的数值来表示资源被缓存存储的时间长度
当 HTTP/1.1 缓存服务器在遇到含有 Expires 头字段的情况时,它会将 max-age 指令视为优先处理对象,并不考虑或跳过该 Expires 头字段。相比之下,在 HTTP/1.0 标准下,则通常会被系统或客户端所忽视。
3、min-fresh:
Cache-Control:min-fresh=60(单位:秒)
min-fresh 指令要求缓存服务器返回至少还未过指定时间的缓存资源。
比如,在将 min-fresh 设置为60秒后的情况下,在这60秒内如果存在无效期的资源将不会被作为响应返回。
4、max-stale:
Cache-Control:max-stale=3600(单位:秒)
使用 max-stale 可指示缓存资源,即使过期也照常接收。
当指令未指定参数值时, 客户端会始终响应, 不管经过多长时间; 当指令指定了具体数值时, 即使已失效, 只要仍在max-stale设置的时间范围内, 客户端仍会响应。
5、only-if-cached:
Cache-Control:only-if-cached
该指令采用 only-if-cached 标记机制来指示客户端仅在缓存服务器已存储目标资源时才触发响应请求。具体而言,在这种情况下, 缓存服务器被指示避免重新加载响应内容, 同时也不需再验证资源的有效性. 当出现请求缓存服务器未找到本地存储的相应资源时, 应返回 504 门限超时状态码以表明请求应重试.
6、must-revalidate:
Cache-Control:must-revalidate
通过触发 must-revalidate 指令进行缓存管理操作后,在执行完该操作后会向源服务器发起重头验证请求以确认缓存中的响应内容是否仍保持其有效性状态。
只有当代理无法与源服务器建立连接时,缓存才必须向客户端发送504(Gateway Timeout)状态码
另外,在应用 must-revalidate 指令时会不考虑请求的 max-stale 指令(即使已经在头部设置了 max-stale 指令,仍然不会产生效果)。
7、proxy-revalidate:
Cache-Control:proxy-revalidate
proxy-revalidate 指令指示所有缓存服务器在接收包含该指令的客户端请求并获取相应响应之前,必须执行有效性验证以确保缓存数据的一致性和完整性。
8、no-transform:
Cache-Control:no-transform
通过采用 no-transform 指令,在请求和响应过程中,缓存不允许修改实体主体所携带的信息类型
这样做可以防止缓存或代理压缩图片等类似操作
三、Cache-Control扩展
cache-extension token:
Cache-Control:private,community=“UCI”
借助缓存扩展标记(token),能够支持Cache-Control头部字段指令的扩展。
参考上文可知,在Cache-Control头部字段中不存在community这一指令。通过引入extension tokens实现了对这一指令的支持。当缓存服务器无法识别该new instruction时,会直接跳过处理。由此可见,在当前系统架构下,extension tokens仅在被相应的缓存服务器所支持时才会发挥作用
