接上篇,HTTP协议有关缓存的部份内容较多,须要重点详讲,故独立成一章。html
《你所应该知道的HTTP》系列相关文章:web
HTTP协议的缓存是经过6个报文头完成的,经过两层协商使web资源可以不那么频繁地在服务器与客户端之间传递,从而节约了流量,提升浏览速度。
以从客户端到服务器的顺序,第一层协商为Cache-Control与Expires;第二层协商为Last-Modified与Etag。segmentfault
请求/响应报文头,缓存控制字段,也就是用于给资源生命期,是http/1.1引入的属性。
Cache-Control的取值可细分为两类,一类是对缓存有直接决定性的值,他们会致使后续的第二层协商被跳过,包括:no-store、public、private;另外一类是相似Expires的值,只是规定了有效期,后续的第二层协商不受影响,包括no-cache、max-age=x、s-maxage=x。浏览器
Cache-Control的取值以下:缓存
属性名 | 说明文字 |
---|---|
no-store | 不缓存该资源。 |
no-cache | 缓存该资源,能够等价与max-age=0。 |
max-age=x | 请求缓存后的x秒再也不发起请求。 |
s-maxage=x | 代理服务器请求源站缓存后的x秒再也不发起请求,只对CDN缓存有效。 |
public | 客户端和代理服务器(CDN)均可缓存。 |
private | 只有客户端能够缓存。 |
形如:服务器
Cache-Control:max-age=0
响应报文头,表明资源过时时间,由服务器返回提供,是http1.0的属性,在与Cache-Control共存的状况下,优先级要低。
Expires的功能基本与Cache-Control的max-age类似,但它是指定一个过时时间点,而Cache-Control的max-age是指定了过时前的秒数。网络
形如:负载均衡
Expires:Fri, 10 Apr 2020 16:30:04 GMT
响应报文头,资源最新修改时间,由服务器告诉浏览器。spa
形如:3d
Last-Modified:Mon, 23 Mar 2020 18:39:50 GMT
请求报文头,与Last-Modified相对应,浏览器把服务器最后一次给的Last-Modified返回,服务器将以此进行对比,判断资源是否须要更新。
形如:
If-Modified-Since:Fri, 10 Apr 2020 14:45:24 GMT
响应报文头,资源内容惟一标识,由服务器告诉浏览器。
形如:
Etag:58b66ccbe349d0d931df877c00d8101d037243dc
请求报文头,与Etag相对应,浏览器把服务器最后一次给的Etag返回,服务器将以此进行对比,判断资源是否须要更新。
形如:
If-None-Match:58b66ccbe349d0d931df877c00d8101d037243dc
如下假定资源已经获取过一次,而且运行在HTTP/1.1环境下,如今进行二次访问。
流程图以下:
说明:
生存时间(TTL)指令告诉浏览器应该缓存某个资源多久,即Cache-Control或Expires的值。
找到给定资源的最佳TTL值并无完美的科学方法,只能凭经验给出一些指导原则。
指导原则:
用户操做 | Expires/Cache-Control | Last-Modified/Etag |
---|---|---|
地址栏回车 | 有效 | 有效 |
页面连接跳转 | 有效 | 有效 |
新开窗口 | 有效 | 有效 |
前进、后退 | 有效 | 有效 |
F5刷新 | 无效 | 有效 |
Ctrl+F5刷新 | 无效 | 无效 |