彻底解决让用户清一下浏览器缓存

nginx设置不缓存静态入口资源

问题描述

每当我们发布版本之后万恶的index.html的缓存老是需要手动清除一下,才能加载新的js文件(虽然我们使用了hash后缀打包js文件,但是html文件入口是固定的)。每次客户出现了问题,都只能在群里说下清一下缓存试试呢。这样也不是个事儿呀...

技术背景

  • 使用nginx做代理
  • 使用webpack等打包出一个唯一的入口文件index.html,或者其他方式的入口html文件
  • 入口html文件中js已经使用hash后缀方式加载

实验步骤

在使用缓存策略前

如上图所示,我访问系统时第一个资源文件就是我的入口地址(为什么不是index.html?这是使用了vue-router的history模式,nginx配置返回静态文件index.html,其实都一样),大家看一下它的状态是200,其他css,js文件都是200(http常用状态码后面会补充)。 当我刷新一下浏览器之后,如下

第一个websocket的咱们先不管,看第二个入口文件它的状态变成了304,而其他css,js文件是200 from memory cache,表示缓存过了。此时如果不强制清除缓存就会出现前面描述的情况一样,即使我下面的css,js文件都有hash后缀但是因为入口文件被缓存了,那么它还是会加载老的js文件,当然如果此css或js文件不存在可能会404错误。
上面两图分别是两种缓存状态。

状态码说明个人理解备注
200OK请求成功正常请求
304Not Modified设置了长缓存、但ETag没有移除时触发协商缓存
200from memory cache不请求网络资源,资源在本地内存当中chrome策略,firefox都是304

结合以上表格可以看出,不管是304还是200 from memory cache都会有存在入口文件被缓存的风险。所以修改nginx配置如下:

location ~ .*\.(htm|html)?$ {
  #原来这样设置的不管用
  #expires -1;
  #现在改为,增加缓存
  add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
  access_log on;
}
复制代码

在使用缓存策略后

不管刷新多少次,都是200正常状态,没有被缓存,但是检测到css,js文件还是原来的所以也不用担心他们会重新加载一遍。 我们再做个线上版本发布的测试,我重新发布项目后,所有文件后缀全部变了,如下图
轻轻刷新一下浏览器,会发现入口html文件状态还是正常的200,而其他js,css文件已经被重新加载了最新版本的,此时再刷新一下浏览器,便会和上面的上面那张图一样的状态。

到此,此问题解决,欢迎补充。

转载于:https://juejin.im/post/5c739f71f265da2de165a7fc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值