Chrome安卓精简模式VueJS SPA缓存异常求助(IIS部署场景)
解决安卓Chrome精简模式(Lite Mode)下IIS部署Vue SPA的缓存残留问题
这问题我之前帮同行排查过,核心原因就是Chrome Lite Mode(现在也叫Data Saver)的谷歌端代理缓存在搞鬼——它会把你的页面存在谷歌自己的服务器上,完全绕开你在IIS里配置的缓存规则,哪怕你关掉IIS服务,用户请求还是会被谷歌代理拦截,返回它缓存的旧内容,这就是为什么你看到Remote Address是谷歌的IP(172.217.30.108),而且返回304未修改的原因。
下面是具体的解决和预防方案:
一、先解决当前的app_offline.htm残留问题
- 首先,确保你恢复默认页后,给
app_offline.htm加上强制不缓存的响应头,哪怕已经不用它了,也要让谷歌代理知道这个页面已经失效:
在web.config里给app_offline.htm单独配置:<location path="app_offline.htm"> <system.webServer> <staticContent> <clientCache cacheControlMode="DisableCache" /> </staticContent> </system.webServer> </location> - 然后,给你的Vue SPA入口页(比如
index.html)做一次资源重命名,比如改成index.v2.html,同时更新web.config里的默认文档设置,把新的文件名设为默认页。这样谷歌代理会认为这是一个全新的资源,不会再返回缓存的旧内容。
二、修复旧Vue应用的缓存问题
虽然你已经配置了cache busting,但Lite Mode很可能缓存了你的入口页(index.html),而入口页是加载所有带哈希的静态资源的关键,一旦入口页被缓存,就算静态资源更新了也没用。你需要:
- 给入口页设置最严格的缓存禁止规则,在web.config里添加:
这个规则会强制谷歌代理每次都从你的服务器拉取最新的入口页,而不是用它自己的缓存。<location path="index.html"> <system.webServer> <staticContent> <clientCache cacheControlMode="DisableCache" /> </staticContent> </system.webServer> </location>
三、临时强制用户端刷新的办法
如果需要快速让用户看到新内容,可以指导Lite Mode用户:长按Chrome的刷新按钮,选择「刷新并忽略缓存」,这个操作会绕过谷歌的代理缓存,直接从你的服务器拉取最新内容。不过这只是临时方案,核心还是要靠服务器端的缓存策略。
四、预防未来出现类似问题
- 每次部署更新时,除了给Vue的静态资源(js、css、图片)加哈希(这部分Vue CLI已经帮你做了),还要给入口页做版本化处理:要么重命名文件(比如
index.v20240520.html),要么在URL里加唯一的查询参数(比如index.html?v=20240520),后者注意有些代理可能忽略查询参数,所以重命名更可靠。 - 始终给入口页设置
Cache-Control: no-cache, no-store, must-revalidate的响应头,不要依赖客户端的缓存设置,因为Lite Mode的代理会优先使用自己的缓存规则。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

