HTTP缓存学习
1. 缓存控制Catch-Control
max-age
:缓存有效期public
:允许其他用户读取缓存(公共缓冲服务器)private
:只允许特定用户读取缓存(公共缓冲服务器)no-catch
:不走强缓存,每次都请求服务器验证缓存是否可用(协商)no-store
:不走缓存,每次直接请求数据
2. 缓存过期判断机制
- 根据
Catch-Control
的s-maxage
或max-age
判断,以s-maxage
为例,若当前时间
>缓存生成时间+s-maxage
则表示已经过期(s-maxage
与max-age
作用都是设置缓存储存最大周期,s-maxage
适用于多用户的公共缓存服务器) - 根据
Expire
比较,Expire
代表一个绝对过期时间,若当前时间
>Expire
,代表缓存已经过期
注: HTTP/1.1
之前Expire
优先级高于s-maxage
或max-age
,之后则相反
3. 协商缓存
根据判断机制判断出缓存过期后,进行协商缓存
Etag
:实体标记,服务器资源每次更改都会引起资源Etag值的变化Last-Modified
:最后更新时间,服务器资源最后更新的时间if-None-Match
:放在请求头用于判断服务器对应值是否与传入值相同if-Modified-Since
:用于告诉服务器字段值早期更新时间,若与服务端不一致,则会处理请求
当客户端第一次请求资源时,服务器会将所请求资源的Etag
和Last-Modified
放在响应头交给客户端
Etag
验证
当客户端第二次请求资源时,会将Etag
作为if-None-Match
的字段值,用于验证资源是否改变,若if-None-Match
与服务端Etag
不一致,说明服务端资源已经更改,服务器接受请求,返回新资源,否则返回304(此时响应头还会有Etag
,即使没有变化)
Last-Modified
验证
当客户端第二次请求资源时,将Last-Modified
作为if-Modified-Since
的字段值,提交给服务端,服务器会对比服务器资源的Last-Modified
与客户端传入的if-Modified-Since
,如果不一致说明资源更改时间不一致,有更新,返回新资源,否则返回304(响应头不会添加Last-Modified
)
Etag
和Last-Modified
比较
Etag
比对的是资源内容,可以检测到细微改变Last-Modified
比对的是资源文件修改时间,在内容未更改仅仅是修改时间更改的情况下也会引起重新发送数据,检查粒度是秒级,秒级以下的更改无法判断
由此可以看出,Etag
能够更加精准控制缓存,两者可以同时只有,服务器优先验证Etag