转自:https://zhuanlan.zhihu.com/p/23299600?refer=study-feweb
1. 思路1,无缓存后端
浏览器向服务器请求资源 a.jpg,服务器找到对应资源把内容返回给浏览器。当浏览器再次向服务器请求资源a.jpg时,服务器从新发送完整的数据文件给浏览器。浏览器
2. 思路2,有缓存无更新缓存
浏览器第一次请求a.jpg 时服务器会发送完整的文件,浏览器能够把这个文件存到本地(缓存),下次再须要这个文件时直接从本地获取就好了,这样就能省下带宽了。服务器
3. 思路3, 缓存+更新机制网络
浏览器第一次请求a.jpg 时服务器会发送完整的文件,服务器在发送文件的时候还附带发送一些额外信息——过时时间,如 Expires: Mon,10 Dec 1990 02:25:22GMT。浏览器能够把这个文件和额外信息存到本地。当再次须要a.jpg的时候浏览器用当前浏览器时间和Expires作个比较,若是当前时间在过时时间之内,就直接使用缓存文件((200, from xx cache);若是在过时时间之外就从新向服务器发送请求要资源(200)。 服务器在每次给资源的时候都会发送新的过时时间编码
4. 思路4, 缓存+更新机制升级版spa
好比:浏览器第一次请求a.jpg 时,服务器会发送完整的文件并附带额外信息3d
Cache-Control: max-age=300;
浏览器把文件和附带信息保存起来。当再次须要a.jpg 时,若是是在300秒之内发起的请求则直接使用缓存(200, from xx cache),不然从新发起网络请求(200)。下面是Cache-Control常见的几个值:code
优势:缓存控制功能更强大
缺点:假如浏览器再次请求资源a.jpg的时间间隔超过了max-age,这时候向服务器发送请求服务器应该会从新返回a.jpg的完整文件。但若是 a.jpg 在服务器上未作任何修改,发送a.jpg的完整文件就太浪费带宽了,其实只要发送一个「a.jpg未被更改」的短消息标示就行了。
5. 思路5, 缓存+更新机制终极版
好比:浏览器第一次请求a.jpg 时,服务器会发送完整的文件并附带额外信息,其中Etag 是 对a.jpg文件的编码,若是a.jpg在服务端未被修改,这个值就不会变
Cache-Control: max-age=300; ETag:W/"e-cbxLFQW5zapn79tQwb/g6Q"
浏览器把a.jpg和额外信息保存到本地。假如浏览器在300秒之内再次须要获取a.jpg时,浏览器直接从缓存读取a.jpg(200, from xx cache)。假如浏览器在300秒以后再次须要获取a.jpg时,浏览器发现该缓存的文件已经不新鲜了,因而就向服务器发送请求 从新获取a.jpg, 在发送请求的时候附带刚刚保存的a.jpg的ETag ( If-None-Match:W/"e-cbxLFQW5zapn79tQwb/g6Q")。 服务器在接收到请求后拿浏览器请求的 Etag 和当前文件从新计算后端 Etag 作个比较,若是两者相等表示文件在未修改则发送个短消息(响应头,不包含图片内容, 304),若是两者不等则发送新文件和新的 ETag,浏览器获取新文件并更新该文件的 Etag。
与 ETag 相似功能的是Last-Modified/If-Modified-Since。当资源过时时(max-age超时),发现资源具备Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(200);若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 ,告知浏览器继续使用所保存的cache。
2018.12.25 更新
2019.3.29 更新: