HTTP缓存机制
Youky ... 2021-10-11 About 2 min
# HTTP缓存机制
# 缓存的分类
首先通过cache-control
字段判断缓存数据是否过期:
- 若缓存可用,直接使用
- 否则进入协商缓存阶段,发送HTTP请求,服务端通过
If-Modified-since
或If-None-Match
字段检查是否更新- 若资源未更新:返回
304
,告诉浏览器从缓存中读取数据 - 若资源更新:返回
200
,并附带资源
- 若资源未更新:返回
用到的字段:
- 强制缓存:
cache-control
- 协商缓存:
ETag
Last-Modified
# 实现缓存机制的有关字段
# cache-control
作为请求字段:
- no-cache:不使用缓存,强制向服务器进行确认
- max-age:最多缓存多久。取值为相对值,相对于资源被请求时服务器记录的时间
- only-if-cached:仅从缓存获取资源
作为响应字段:
- public/private:是否允许中间服务器进行缓存
- no-cache:客户端后续每次请求必须先向服务器确定资源的有效性。若资源未改变则返回304,客户端再使用缓存数据
- no-store:不进行缓存,每次都向服务器请求资源,返回数据和200
# If-Modified-Since
用于请求头中,和响应中的last-modified
对应,表明能接受的最后更新时间
# Last-Modified
资源最后的修改时间。
如果编辑了文件,但其实内容没有修改,也会造成缓存失效。
# If-None-Match
取值为服务器返回的ETag字段的内容,比较ETag是否发生变化和响应中的ETag
对应。
比If-Modified-Since
优先级更高
# ETag
资源的唯一标识。编辑了文件但未改变内容时,ETag不会改变
ETag如何生成?
没有明确的生成办法,一般使用内容
和最后修改时间
的散列值
# only-if-cached
客户端只接受缓存数据,不向源服务器请求
# 代理缓存
# 意义
通过在代理服务器进行缓存,减少源服务器的压力。
但对于私密数据,一般不会进行代理缓存。
# 涉及到的字段
- 开启代理缓存:
Cache-Control: public
- 控制缓存在代理服务器中的有效时间:
s-maxage