NemoZhong / blog-nemo

0 stars 0 forks source link

浏览器(chrome)在nginx不设置缓存策略时的表现 #1

Open NemoZhong opened 2 years ago

NemoZhong commented 2 years ago

公司一个比较老的项目出现过这样一个缓存问题: 时隔很久,项目发版后,访问项目地址,发现页面资源始终是老版本的内容😅😅!!该项目在其他页面登陆,然后跳转到该项目根路径/,路由做了重定向 /home的操作。访问根路径时,是上个版本的资源,重定向到/home后,刷新变为新版本的资源,url里删除/home,资源又变成老版本了。

先说解决方案: nginx配置html文件走协商缓存,另外无奈之举,通知客户:这次更新需要清除浏览器缓存,以后就不需要了(to b项目的优势😌😌)

因为以前nginx没有配置cache-control,expires等缓存策略的字段,所以在不清除浏览器缓存的情况下,浏览器的缓存是否有效完全是由浏览器自己去判断了,这里比较好奇就去研究了一下(顺便水成下次技术分享主题)

感谢一位非常纯粹的同事的指路MDN 上get到2个信息:

在不设置缓存策略的情况下

freshnessLifetime=(Date - Last-Modified) / 10 expirationTime = responseTime + freshnessLifetime - currentAge

PS:下面那个公式完全没看懂,currentAge通篇没有找到指的是啥,有点误入歧途了 freshnessLifetime=(Date - Last-Modified) / 10 这个才是浏览器默认缓存行为的核心

所以新鲜度实际上是浏览器判断资源是否稳定,如果服务器资源越久没有更新,说明这个文件越稳定,再次请求资源越应该使用缓存,过期时间也相对更久一点。比如说发版前去访问一个一年前没有访问过的,且没有设置缓存策略的老项目的资源,服务器响应的资源新鲜度为:(Date - Last-Modified )/ 10 ,表示这个缓存有效时间要到1.2个月 (1年/10)才失效,期间,如果不清缓存访问资源。强缓存始终命中,即使发版了由于缓存有效,所以始终走强缓存。

另外普通刷新由于相当于浏览器给请求头加了cache-control:max-age=0,走协商缓存,所以刷新会返回新的资源。并且公司项目的根路径会重定向到/home,在/home刷新实际上是服务器拿叫home的资源,由于nginx配置了try_files字段,资源404时返回index.html,并且这份index.html不会更新根路径/下的index.html,浏览器认为属于不同的资源。所以理论上,如果用户手速很快,在访问根路径时,在重定向之前,如果执行了刷新,拿到新资源就会覆盖掉之前的缓存

NemoZhong commented 2 years ago

ppt: https://browser-cache.vercel.app/1