Google Cloud Run缓存未失效 站点更新后仍加载旧版本如何解决
问题根因
这根本不是DNS缓存的问题,刷公共DNS缓存完全是找错了方向——你遇到的是HTTP缓存层异常。
从响应头Date停留在6月20日、只有强制刷新/从未访问过的新浏览器能拿到新内容、普通刷新就回退旧版的特征判断,旧版本站点内容被Google边缘节点或者你服务自身的缓存策略长期缓存了,尤其是单页应用的入口index.html没有触发回源校验,才会导致用户一直拿到旧版本。
分步解决操作
- 先检查Cloud Run的流量分配是否正确
打开Cloud Run控制台,找到对应服务的版本管理页,确认6月21日部署的React新版本Revision是不是分配了100%的流量。如果有旧版本残留流量占比,手动把所有流量切到新版本,先排除部署时流量切错的低级问题。 - 检查是否意外开启了边缘缓存
如果你是通过负载均衡把流量转发到Cloud Run、手动开了Cloud CDN,旧版本内容会被CDN边缘节点缓存住,不会自动回源拉新版本:- 到负载均衡后端配置里,找到对应Cloud Run后端的缓存规则,把缓存模式改成「遵循原站缓存控制头」
- 单独给
/、/index.html路径配置缓存TTL为0,强制访问这两个路径时必须回源校验 - 提交配置后等2-5分钟让边缘节点同步规则,再测试访问
- 修正前端静态资源的缓存响应头
这是单页应用部署最容易踩的缓存坑,不管你是用Nginx、Node服务还是其他静态服务器托管React打包产物,必须按规则配置响应头:
对入口文件index.html,配置不缓存策略,对应响应头如下:
对打包后带内容hash的JS、CSS、图片等静态资源(比如Cache-Control: no-cache, no-store, must-revalidate Pragma: no-cache Expires: 0main.9a7b2c.js这类文件名带随机串的文件),可以配置长期缓存,对应响应头如下:
这套配置是React/Vue这类单页应用的标准部署方案:入口文件每次访问都回源拿最新的,带hash的资源因为文件名会随内容变化,就算缓存一年也不会和新版本冲突,从根源上避免新旧版本串台的问题。Cache-Control: public, max-age=31536000, immutable - 快速验证方法
访问站点时在URL末尾加一个随机查询参数,比如/?v=fixcache0621,如果加了参数之后能正常加载新版本,就100%确认是缓存配置问题,等前面的规则生效后,所有普通用户访问都会自动拿到最新内容,完全不需要让用户手动清缓存或者强制刷新。
补充:如果你是直接用Cloud Run默认分配的
xxx.run.app域名访问、没有自己配负载均衡和CDN,那90%的问题是你服务自身返回的缓存头配错了,把index.html设置成了可长期缓存,导致浏览器和Google默认的边缘缓存层一直存着旧版本的入口文件。
内容的提问来源于stack exchange,提问作者Matheus Alexandre de Sena
相关产品推荐
相关产品推荐

