前端静态资源并不是每一次都发生变化,那么浏览器会根据协议定义的缓存头来缓存静态资源
关于浏览器的缓存头有
- cache-control
- last-modified
- expires
- eTag
头解析
cache-control 语法
- 客户端可以在http请求中使用的
Cache-control: max-age
Cache-control: max-stale
Cache-control:min-fresh
Cache-control: no-cache
Cache-control : no-store
Cache-control: no-transform
Cache-control: only-if-cached - 服务器可以在响应中使用的有
Cache-control: must-revalidate
Cache-control: no-cache
Cache-control:no-store
Cache-control: no-transform
Cache-control : public
Cache-control: private
Cache-control: max-age
cache-control: s-maxage
缓存指令
- public 表明响应可以被任何对象缓存
- private 表明响应只能被单个用户缓存,不能作为共享缓存
- no-cache 在发布缓存副本之前,强制高速缓存将请求提交到服务器进行验证
- only-if-cached 表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝
到期
- max-age 设置缓存存储的最大周期, 时间是请求时间
- s-maxage 覆盖max-age或 expires 并且私有缓存中它被忽略
- max-stale 表明客户端愿意接收一个已经过期的资源
禁止缓存
no-cache no-store must-revalidate
缓存失效的判断
对于包含特定头的请求,会先判断 cache-control 字段,如果没有这个字段会判断 Expires 通过比较Expires和头里面的date进行判断,如果都没有,就会找last-modified信息,来判断缓存是否有效
缓存验证
作为缓存的一种强验器,Etag响应头是一个队用户代理不透明的值,如果资源请求的响应头里含有Etag,客户端可以在后续的请求的头中带上 if-none-match头来验证缓存
Last-modified 响应头可以作为一种弱的校验器,客户端可以带上If-modified-since来验证
当向服务器发起缓存验证请求时,服务会返回200和 304, 200 返回新文件同时更新缓存,如果是304没有返回body,直接使用本地缓存,同时更新缓存时间
网友评论