强缓存(本地缓存)
浏览器在第一次请求资源后,再次请求该资源时,会先获取该资源缓存的header信息,如果命中强缓存,则不继续请求服务端数据,直接使用本地缓存数据,不会与服务器通信、
相关字段
http1.0中使用expirse,用于指定有效期截止时间,如果发送请求的时间在expirse之前就会使用本地缓存
http1.1中使用Cache-Control:max-age=num,num是一个相对值,再次发送请求时会使用资源第一次请求的时间与num相加计算出资源过期时间,再与当前请求时间比较,在过期时间之前则使用本地缓存
协商缓存
由服务器决定是否使用缓存数据,服务器根据相关header字段判定
Last-Modified/If-Modified-Since
(1)第一次请求资源,服务器的response header中会携带 Last-modified标示文件修改时间,
(2)再次请求该资源时request header会使用这个(1)Last-Modified值作为If-Modified-Since的值
(3)服务器在收到If-Modified-Since后会与资源在服务器上的最后修改时间做对比,对比一致则返回304通知浏览器使用本地缓存。
(4)如果服务端没有命中缓存,则正常返回数据,并在reponse header中携带Last-Modified
Etag/If-None-Match
判断过程与Last-Modified类似,不同的是服务端返回304时也会重新生成Etag并携带在reponse header中即使这个Etag没有变化
参考
Last-Modified与Etag
Last-Modified与Etag各有优缺点,根据实际情况选择
Etag解决的问题:
- 有些周期性修改的文件,只有修改时间改变,文件内容并没有修改,这时我们希望使用的是缓存数据,Last-Modified不能达到需求
- Last-Modified时间有精度是s级,如果文件在1s内有修改,这是Last-Modified的判断就会失效
- 有写服务器不能精确计算文件的修改时间
Last-Modified解决的问题:
- 有写文件生成Etag的代价较大,对性能有影响
Cache-Control
no-store:不使用浏览器缓存
no-catch: 使用协商缓存
max-age: 强缓存
public: 可以被CDN等中间代理缓存
private:仅客户端可缓存