- 第一次加载资源,服务器返回 200,浏览器从服务端下载文件,并缓存资源文件和 response header
- 优先进行强制缓存,判断当前请求和上次请求成功间隔是否超过 cache-control 的 max-age。没超过就从本地读取资源
- 本地资源过期,则进入协商缓存,向服务器发送带有 If-None-Match 和 If-Modified-Since 的请求。
- 服务器收到请求后,优先根据 Etag 的值判断被请求的文件有没有被修改。Etag 值一致则没有修改,即命中协商缓存,返回 304;不一致则有改动,返回新的资源文件和 Etag 值。
- 如果服务器收到的请求没有 Etag 值,则将 If-Modified-Since 和被请求文件的最后修改时间做比对,一致则命中协商缓存,返回 304;不一致则返回新的 last-modified 和文件并返回 200;