Http协商缓存
虽然http缓存完全是后端处理,但是前端也需要了解。
http缓存是通过 Cache-Control 响应头控制的
Cache-Control 的值和含义常用的有以下几种:
public:中间的代理和客户端都可以缓存,Cache-Control: max-age=60 就是默认 public
private:只有客户端可以缓存,中间的代理不可以缓存
no-store:每次都请求最新的资源文件
no-cache: 协商缓存
Cache-Control: max-age=60 ,强制缓存60秒,60秒之后才会判断协商缓存
下面说说协商缓存:
协商缓存有两种:
1、Last-Modified(响应头) If-Modified-Since(请求头) 对应,单位是秒,表示文件的修改时间,通过对比 Last-Modified(响应头) If-Modified-Since(请求头)的值是否相等控制,相等则返回 304 状态码和旧的 Last-Modified ,不相等则返回 200 状态码和新的 Last-Modified 和新的资源文件
2、ETag(响应头)If-None-Match(请求头) 对应,是根据文件内容计算的一串字符
通过对比 ETag(响应头)If-None-Match(请求头)的值控制,相等则返回 304 状态码和旧的 LETag ,不相等则返回 200 状态码和新的 ETag 和新的资源文件
优先级:Last-Modified 和 ETag 同时存在的情况下,ETag 优先级更高。
原因:
1、文件操作一般是毫秒或者微秒级别的,Last-Modified 的单位是秒,可能不会把最新的资源文件返回,ETag是根据文件内容等计算判断是否有修改,可以返回客户端最新的资源文件
2、资源文件可能是不断重复删除然后生成的,文件内容可能没有变化,但是修改时间却变了,这个时候通过 Last-Modified 判断会返回资源文件,但是其实不必,这样就浪费了流量,使用 ETag 就避免了这种情况。
附上一张http判断缓存的流程图:
