HTTP缓存过程详解
http缓存作为面试常考题目,我们必须理解他的详细过程,接下来请大家务必理解并牢记这篇博客的所有内容,大家也不要闲内容多,因为http不管是在面试还是在工作中,真的很重要。而且在面试中,我们可以通过详细描述http缓存,不仅让面试官对我们有好感,还能拖延时间,让面试官少问其他比较难的问题。
HTTP文件缓存是基于HTTP协议的浏览器端文件缓存机制。
在文件重复请求的情况下,浏览器可以根据HTTP响应的协议头信息判断是从服务器端请求文件还是从本地读取文件。
Chrome控制台Application下的Frames就可以查看浏览器的HTTP文件缓存列表内容。
首先我们需要了解HTTP缓存的两种方式。
- Expires:在HTTP1.1版本之前,浏览器缓存主要是通过对HTTP 1.0 的
Expires
头部控制来实现的,Expires
只能根据绝对时间来刷新缓存内容。 - Cache-Control:HTTP 1.1增加了
Cache-Control
头域,可以支持max-age
用来表示相对过期时间。
另外请求服务器时也可以根据Etag
和Last-Modified
来判断是否从浏览器端缓存中加载文件,此时缓存的控制和判断将决定服务器的响应报文中头部内容的状态码200还是304。
浏览器发起请求,头部域字段的判断过程:
- 浏览器会先查询
Cache-Control
(这里用Expires
判断也是可以的,如果两者都设置了,则只有Cache-Control
的设置生效)来判断内容是否过期,如果未过期,则直接读取浏览器端缓存文件,不发送HTTP请求,否则进入下一步。 - 在浏览器端判断上次文件返回头中是否含有
Etag
信息,有则带上If-None-Match
字段信息发送请求给服务器,服务端判断Etag
未修改则返回304,如果修改则返回200,否则进入下一步。 - 在浏览器端判断上次文件返回头中是否含有
Last-Modifed
信息,有则带上
If-Modified-Since
字段信息发送请求,服务端判断Last-Modified
失效则返回200, 有效则返回
304。 - 如果
Etag
和Last-Modified
都不存在,则直接向服务器请求内容。
这就是Cache-Control
、Etag
和Last-Modified
控制请求缓存的主要过程。
我们可以结合流程图来详细理解下HTTP缓存判断过程。