一 复杂的Cache-Control
上一次课我们讲到'Cache-Control',而Cache-Control的'取值'非常'复杂',本节进行细讲
① Cache-Control简介
1) 位置:Cache-Control既可以用在'请求[请求头]'中,也可以用在'响应[响应头]'中
2) 含义:而且'同样的值'在请求和响应中'含义'不一样
3) 分类:Cache-Control根据取值分为'三类': 红色、黑色、蓝色
[1]、红色: '选项'后面跟'=十进制的数字(s)',例如: Cache-Control: max-age=3600
备注: 这里的'选项'就是'cache-directive'
[2]、黑色: '选项'后面不用跟token,直接输入'token',例如: Cache-Control: no-cache
[3]、蓝色: 表示有'两种用法',涉及'响应中'的'no-cache'和'private'
② Cache-Control用在请求中七个取值的含义
++++++++++ (1)前'三'个'红'色的取值 ++++++++++
核心: 对缓存的进行'复杂'且'精细化'的控制
max-age: 超出之后,'告诉服务器'不要使用自己的缓存,直接去找相应的'源'服务器,获取'原始'的响应
max-stale:
[1]、虽然'你服务器缓存'不新鲜了
[2]、但是过期的'秒数'没有超出我客户端'告诉你'的秒数
[3]、我客户端'不介意'你的'缓存过期',想让你继续用'服务器的过期缓存'响应给我
min-fresh:
[1]、首先你'服务器'的缓存'不能'过期
[2]、其次至少要'经过min-fresh秒'都'不能过期'的话,才能'给我客户端用'
++++++++++ (2)四个'黑色'的取值 ++++++++++
0) no-cache
理解: 除非'我'带'缓存条件',并且'服务端校验成功304',才能使用'服务端'的缓存
1) no-store
理解: 告诉'(代理)服务器'你不要对'从源服务器'获取到的响应进行'缓存存储'
关注: nginx'是否遵守'该规定
2) no-transform
细节: 因为有些'代理服务器'会对源服务器的响应的'body'进行转换'修改'
3) only-if-cached
特点: 即使'你(代理服务器)自身'没有'缓存',也不要从'源服务器'获取,给我'返回错误'
③ Cache-Control头部在响应中的值
遗留:对于'使用频率不同'的缓存,应该'如何更新'它的缓存时间
④ 答疑解惑
疑问: --> '客户端收到的缓存不是proxy代理缓存服务器发送的'场景
[1]、请问: response有'带max-age头部'指定浏览器缓存时间
[2]、但是response'没有回传age头部'的情况下,浏览器会'怎么缓存'这么response呢?
解答: 基于'收到的时间'以及'max-age'来判断'过期与否'
1) 'Ctrl+F5'发出请求时,会在请求头中加入'Cache-Control:no-cache和Pragma:no-cache'
2) F5或'转圈' 发出请求
特点:携带'If-Modified-Since 或 If-None-Match'和'Cache-Control: max-age=0'请求头
⑤ 遗留
RFC 7234 Age和Cache-Control头 RFC9111
nginx的expires指令控制Expires和Cache-Control响应头
⑥ 案例1
1)Cache-Control与'nginx的expires指令'的关系和优先级别
遗留: nginx的expires指令,为了兼容HTTP1.0和HTTP1.1,会生成两个'对应'的字段
2) 自己遇到过'时钟不同步' --> 'Date' 和'response_time'
+++++++++ 缓存新鲜度的案例 -->'时间不同步很常见(5s)'或者'时钟不同步'等,用nginx来模拟
+++++++++ touch强制修改时间(a、m、c)时间 --> 观察缓存 -->内容其实没有发生变化,文件大小
⑦⑧⑨⑩