Http头信息(一)——通用头信息(一)——Cache-Control

文章目录

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
  • 对于请求来说,该指令的意思是:可以给我缓存,但是这个缓存必须是向服务器验证后证明是有效的。
  • 对于响应来说,该指令的意思是:可以缓存这个响应,但使用前必须向服务器做有效性验证
  1. no-store
	Cache-Control:no-store
  • 对于请求和响应来说,不得以任何形式存储请求或响应的内容
  1. max-age
	Cache-Control:max-age=60
  • 对于请求来说,可以接收:自响应被发送那一刻开始算起,不超过60秒的缓存
  • 对于响应来说,这个响应可以缓存,且有效期为60秒
  1. no-transform
	Cache-Control:max-age=60
  • 对于请求和响应来说,缓存不能改变其内的媒体类型。例如不能压缩等

2)、请求专用的

  1. max-stale
	Cache-Control:max-stale=60

可以接收过了有效期(max-age指定),但是没过max-stale的缓存

  1. min-fresh
	Cache-Control:min-fresh=60

可以接收在未来60秒内,处于有效期(max-age指定)的缓存

  1. only-if-cached
	Cache-Control:only-if-cached

只接收缓存。如果没有缓存,则返回 504 Gateway Timeout

3)、响应专用的

  1. public
	Cache-Control:public

此响应可以被任何中间者缓存

  1. private
	Cache-Control:private

此缓存只能被发起请求的客户端缓存

  1. 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 后才能使用,没有例外。

  1. proxy-revalidate
	Cache-Control:proxy-revalidate

must-revalidate一致,区别为:这个指令不能作用于私有缓存上。什么是私有缓存?
Cache-Control:private会将缓存存在私有缓存中

  1. s-maxage
   Cache-Control:s-maxage=60

max-age类似,这里的s代表共享,并且,这个指令仅用于CDNs或者其他中间者(intermediary caches)。这个指令会覆盖max-ageexpires响应头

看完了,休息一下,下一节讲Connection字段,欢迎关注,以获取最新的更新

上一篇:Oracle表与索引的分析及索引重建


下一篇:mysql中间件proxysql实现mysql读写分离