前言
在网上看了无计其数关于HTTP缓存的文章,在这里记录下自己的理解和总结,尽量使用最简单的流程来缕清缓存机制的从头到尾的过程。
疑问
作为前端开发者,对于浏览器调试界面的network肯定都有所了解,以一个图片资源为例,我们刷新页面,network中此图片资源时而返回status 200,时而返回200(from disk cache),时而返回304 (not modify),我们都知道是缓存导致状态码的不同,但是到底是什么情况下才会返回对应的状态码呢,傻傻分不清楚。
解析
假如我们访问这个图片资源,服务器会返回资源文件和关于这个资源的响应信息如下:
1 | (Status-Line) HTTP/1.1 200 OK |
以上信息中,关于缓存的key有 Last-Modified
Etag
Expires
Cache-Control
,
Last-Modified: 上次资源修改时间
Etag: 资源的标识符,每次修改资源都会对应生成一个标识符来表示此版本的资源,可以理解成资源版本号
Expires: 资源过期时间,返回的是服务器时间
Cache-Control: 资源缓存有效期,以秒为单位
HTTP缓存机制分为强缓存和协商缓存:
· Expires和Cache-Control是触发强缓存的key
· Last-Modified和Etag是触发协商缓存的key
强缓存优先级高于协商缓存,也就是说,会先看强缓存,强缓存生效,就直接使用强缓存,强缓存过期,再去使用协商缓存。
那么当浏览器加载资源时,缓存机制的处理流程如下:
1、查看Cache-Control和Expires过期没,如果这两项都没过期,就直接使用浏览器目录chche文件下的缓存文件,返回状态码200(from disk cache),这一步,没有访问服务器。
2、假如Cache-Control和Expires都过期了,HTTP请求中就携带Last-Modified和Etag(协商缓存)去访问服务器资源,服务器会根据HTTP带来的信息和当前服务器关于此资源的最新的Last-Modified和Etag进行对比,对比结果有两种:
如果HTTP中的Last-Modified和Etag信息和服务器中的Last-Modified和Etag信息一致,就说明没有修改,返回状态码304(Not modify)。
对比结果不一致,返回状态码200,并返回新的资源文件。
以上便是自己对缓存机制的理解,如有写的不对的地方,还望指正互相交流。
(完)