一 什么样的响应才会被缓存
本节'讨论'重点:
1) 基于'Cache-Control'的各种'取值'方式,来'讨论'什么样的响应会'被缓存'?
2) 使用'本地已经缓存好上次响应的条件'是什么?
① 使用缓存分两步
使用缓存'分两步':
1) 客户端先把'响应'缓存下来 --> '保存'
2) 客户端将要'发起'请求的时候,'检查'当前请求'是否'能够使用已经缓存的响应 --> '检查'
② 什么样的HTTP响应会被缓存
通俗: 浏览器通过'哪些动动(信息)'来判断要缓存'响应的内容'
③ 其它响应头部
1) Pragma: no-cache '跟' Cache-Control: no-cache '含义'相同
2) Pragma: no-cache'兼容'http 1.0,Cache-Control: no-cache是'http 1.1'提供的
++++++++++ "Expires"和"Cache-Control"区别 ++++++++++
nginx设置expires指令不同的值Expires、Cache-Control、Pragma响应头的取值
④ 使用缓存作为当前请求响应的条件
遗留: 多个'条件'同时满足,怎么决策?
重点: 虽然我们已经'有了缓存',但是想使用这些缓存是'有条件'的
通俗: 如何才能'命中hit'缓存
1) 'url'和'method'必须和'之前的请求'一致
漫谈:HTTP网络协议中Vary响应头 HTTP请求的响应头部Vary的理解
++++++++ 'no-cache'和'no-store'区别 ++++++++
1) Cache-Control: no-cache'误解',使人误以为是'响应不被缓存'
2) 实际上Cache-Control: no-cache是会'被缓存'的
特点: 只不过每次在'向客户端(浏览器)'提供响应数据时,缓存都要向服务器评估'缓存响应'的有效性
通俗: 我虽然'本地缓存'了,但是我'持怀疑态度',每次都要向'服务器'确认本地缓存的'有效性'
补充: 每次都会'发起网络请求',如果缓存'没过期(预估时间)',则收到'304'使用本地缓存
3) Cache-Control: no-store: 这个才是响应'不被缓存'的意思
⑤ Vary响应头
Vary在'nginx'典型应用: '压缩',以及'nginx缓存'; Vary 做'更复杂'的缓存匹配的事情
nginx proxy模块对上游Vary响应头处理 gzip模块的gzip_vary指令 理解Vary
Content-Encoding与Accept-Encoding HTTP 协议中的Content-Encoding
⑥ 如何缓存更新频率不同的资源
核心: 如何缓存'更新不同频率'的'资源(resources)'
说明: 以'百度'为例'讲解'
++++++++++++ "分割线"
1) html'经常'会发生变化 ; jss和css一般'不会'发生变化,
潜在问题: 'html'设置不合适或者太长的过期时间,导致用户获取到'非预期'的过期资源
2) 解决'策略'
[1]、html'后缀'的文件设置'不允许'缓存,或者设置'非常短'的时间
[2]、html中通过'版本号'引用js和css,'url带版本'
备注: 'v1'版本虽然被缓存了也'没关系',因为'html'引用v2,我现在不用v1了,用'v2'
eg: 当响应中没有'明显指出过期时间'的时候,会加上'113'
哪点: 客户端是否能'识别出'
⑧ 验证请求和响应
⑨ 答疑解惑
说明: 一般我们自己搭建'梯子','客户端'和'代理服务器'在一台机器上
思考:由'上游设置'缓存时效还是'nginx中间代理'设置缓存时效?
1) 忽略上游的'Cache-Control相关响应头',自定义'add_header'响应头 --> "nginx控制"
2) nginx不做'任何操作' --> "后端控制"