前言:
我们访问一些网站的是时候,经常看到静态资源后面都有一个时间戳或日期之类的,其实是为了控制缓存,如图左:
Http响应码304
这里我们先谈下http响应码304
,首先304状态码表示浏览器数据未发生改变,直接使用本地缓存。
请求过程:
浏览器向服务端请求资源,服务器会看是否携带Last Modified
头,即上次修改时间,若没有则响应200;
若有则比较Last Modified
和服务端资源修改时间,若客户端资源修改时间小于服务器资源修改时间,则响应200;若大于则响应304,直接使用客户端缓存。
为什么静态资源要加时间戳
上面讲到Http 304状态码其实已经帮我们实现了控制缓存功能 (其实缓存功能本质是浏览器帮我们实现的,这点要分清),为什么还要再静态资源后面加时间戳呢?
其实,在生产环境中,我们会存在资源频繁的修改和上线的情况,有时会存在这样的情况:
服务器在-10-01上线用户在-10-05访问,浏览器记录下修改时间-10-05上线新css/js等文件,最后一次修改时间还是保留上次上线的时间(极端情况)-10-06 用户再次访问,发现客户端最后修改时间 > 服务器文件修改时间,因此不会刷新缓存
为了避免浏览器一直使用旧的缓存资源,所以上线时,一般都会给静态资源加上一个时间戳(一般为上线日期),如index.js?v=-5-15
,实现强制刷新浏览器缓存。
温馨提示: 作为用户来说当发生缓存不更新时,我们可以清除浏览器缓存,或使用Ctrl+F5
强制刷新。