Open ntscshen opened 7 years ago
Cache-Control
:控制缓存有效时间
Last-Modified
:缓存失效后,向服务器查询是否有更新
一般是配合使用
Cache-Control
是Last-Modified
的前置判断, 在第一次请求页面的时候,会通过Cache-Control
的指示缓存资源,同时设置资源的Last-Modified
。 当再一次请求页面资源时,根据Cache-Control: max-age=xxx
指定的时间,在这个时间期间内,每次向服务器获取资源时,都会直接获取缓存内容,并且响应码为 200 Ok ( from disk cache )。 若资源过期,则会向服务器发起请求,此时请求中会带上If-Modefied-Since
请求头, 服务器根据该字段的值进行一定的逻辑处理 1、如果资源没变,则返回304告知浏览器直接使用缓存 2、如果资源变更,则返回最新资源,并且响应码为200,同时更新 Last-Modified 、 Cache-Control字段( 一个全新的请求 )。
和Last-Modified一样,对文件进行标识。不同的是,Etag的取值是一个队文件进行标识的特征字串。在向服务器查询文件是否有更新时,浏览器通过 If-None-Match 字段把特征字串发送給服务器,由服务器和文件最新特征进行匹配,来判断文件是否有更新。 Etag和Last-Modified 可以根据需求使用一个或者两个同时使用。两个同时使用时,只要满足其中一个条件,就认为文件没有更新
在资源内容更改后,更改动态网页中的静态资源网址,强制用户下载新的响应 这真是一个伤感的话题,上家公司每次更新都是人肉修改的链接
在实际应用中,为了解决
Cache-Control
缓存时长不好设置,已经"消灭304",Web端常常采用的方式是
- 把在需要缓存的资源设置
Cache-Control:max-age= 31536000
, 正常情况是设置成一年。在一年内,使用本地缓存; 那问题来了,你不让浏览器发资源请求,这缓存怎么更新呐?- 通过更新页面中引用的资源路径( MD5 ),让浏览器主动放弃缓存,加载新资源
- 至于如何替换DM5的静态资源路径 - 使用构建工具 webpack 资源修改变更过文件名
这块属于静态资源优化
Cache-Control
判断是否命中强缓存策略,如果没命中,则进入协商缓存Last-Modified
和 Etag
判断是否命中协商缓存,如果没有命中,则直接从服务器获取资源
http资源缓存策略