网站更新了却还显示旧页面?CDN 缓存、浏览器缓存与 DNS 缓存逐层排查全解
「明明已经更新了,为什么还是旧的」是做网站最常听到的一句抱怨。站长刚发布了新版本,自己刷新几次都正常,用户却截图说按钮还是老样子;或者同一时间,一部分地区的访客看到新页面,另一部分看到旧页面。普通访客也会遇到:某个网站公告说已经修复,自己这里还是报错。
页面从源站到你的屏幕,中间至少经过四层缓存:CDN 的边缘节点、浏览器的 HTTP 缓存、网站注册的 Service Worker,以及决定你连到哪台服务器的 DNS 缓存。任何一层留着旧内容,你看到的就是旧页面。而且 CDN 在全球有很多边缘节点,每个节点各自缓存,所以不同地区、不同网络的人看到的版本可能不同。下面先讲四层缓存的差别,再给出逐层排查的步骤。
四层缓存的差别
判断是哪一层的最快方法是看范围:所有人都是旧版,问题在源站或 CDN 的全局缓存;只有部分地区是旧版,问题在个别边缘节点;只有你一台电脑是旧版,问题在浏览器或 Service Worker;网站换了服务器之后才出现的,多半是 DNS。
| 缓存层 | 存在哪里 | 由谁控制 | 典型症状 | 清除方式 |
|---|---|---|---|---|
| CDN 边缘缓存 | 离访客最近的边缘节点 | 站长与 CDN 规则 | 部分地区看到旧版 | 在 CDN 控制台按网址或全部清除 |
| 浏览器 HTTP 缓存 | 访客自己的浏览器 | 响应头 Cache-Control | 只有某台电脑是旧版 | 强制刷新或清除站点数据 |
| Service Worker | 浏览器里的后台脚本 | 网站代码 | 强制刷新也无效 | 开发者工具里注销 |
| DNS 缓存 | 系统、路由器、运营商 | 域名解析记录的 TTL | 换服务器后仍连旧地址 | 刷新系统 DNS 缓存 |
| 源站自身缓存 | 服务器上的页面缓存插件 | 站长 | 所有人都是旧版 | 清除服务器端缓存 |
逐层排查:分步操作步骤
- 第一步:先把网络线路准备好。要比较不同地区看到的版本,就用刺猬VPN 分别连到两三个不同地区的节点,再打开同一个网址,每个地区的访问会落到不同的边缘节点上,能快速判断是不是个别节点的缓存没更新。客户端用自定义用户名和密码注册,不需要邮箱和手机号;
- 第二步:在终端执行 curl -I 加网址,只看响应头。重点看 age(内容在缓存里放了多少秒)、cache-control(缓存规则)、etag 或 last-modified(内容版本标识);
- 第三步:用的是 Cloudflare 时看 cf-cache-status:HIT 表示命中缓存,MISS 表示刚从源站取,EXPIRED 表示过期后重新取,STALE 表示源站不可用时返回了旧内容,DYNAMIC 表示不缓存;其他 CDN 一般看 x-cache;
- 第四步:在网址后面加一个随意的查询参数,比如问号后接 v=2,再请求一次。带参数能拿到新内容、不带参数拿到旧内容,就能确认是 CDN 缓存;
- 第五步:到 CDN 控制台清除缓存。Cloudflare 在「缓存」→「配置」里选「清除缓存」,优先用「自定义清除」按网址清除,只有大改版时才用「清除所有内容」;
- 第六步:排除浏览器缓存。按 Ctrl 加 F5,或打开开发者工具,在「网络」面板勾选「停用缓存」后刷新;
- 第七步:排除 Service Worker。在开发者工具的「应用」面板找到「Service Worker」,点「取消注册」,再到「存储」里清除站点数据;
- 第八步:排除 DNS。Windows 执行 ipconfig /flushdns,macOS 执行 sudo dscacheutil -flushcache,再用 nslookup 查看域名当前解析到的地址是否为新服务器。
按现象排查:谁看到旧版、为什么
排查时记住一个原则:先确认源站本身已经是新版,再往外一层一层查。直接用服务器地址或源站的内部域名访问一次,如果源站返回的也是旧版,那问题在部署本身,清多少缓存都没用。确认源站无误后,再根据下面的现象判断旧内容卡在哪一层。每清除一层就重新验证一次,不要一口气把所有缓存都清掉,否则下次遇到同样的问题,依然不知道根源在哪。
- 所有人都看到旧版:源站部署没成功或服务器端页面缓存没清,先直连源站确认;
- 部分地区看到旧版:个别边缘节点缓存未过期,在 CDN 控制台按网址清除,或者等缓存时间到期;
- 页面是新的,样式或脚本是旧的:静态文件文件名没变,缓存时间又很长,给文件名加上内容哈希;
- 强制刷新后仍是旧版:网站注册了 Service Worker,在开发者工具里取消注册后再刷新;
- 换了服务器后部分用户连到旧服务器:DNS 记录的 TTL 还没过,或运营商的 DNS 缓存了旧记录;
- 源站宕机时仍能打开旧页面:CDN 开启了「源站不可用时提供旧内容」,这是有意的设计,恢复后会更新;
- 登录后的页面也被缓存:缓存规则写得太宽,把带 Cookie 的个性化页面也缓存了,需要立即修改规则并清除缓存。
缓存策略与排查方式怎么选
最稳妥的组合是:HTML 页面缓存时间短,或设置为每次都向源站确认是否更新;样式、脚本、图片的文件名带内容哈希,缓存时间设得很长。这样发布新版本时,HTML 一更新就引用新文件,旧文件自然不再被访问。用线路在不同地区复查时,免费节点适合偶尔对比,频繁发布、需要每次核对多个地区的,会员节点覆盖的地区更多。实际可用性取决于当前网络环境。
| 对比项 | 按网址清除 | 全部清除 | 缩短缓存时间 | 文件名加哈希 |
|---|---|---|---|---|
| 生效速度 | 很快 | 很快 | 要等旧缓存过期 | 发布即生效 |
| 对源站压力 | 小 | 大,所有请求回源 | 长期偏大 | 小 |
| 适合内容 | 单个页面改动 | 大改版 | 经常更新的页面 | 样式、脚本、图片 |
| 风险 | 漏清相关网址 | 短时间回源流量激增 | 命中率下降 | 需要构建工具支持 |
| 多地区对比 | 免费节点永久免费、不限流量、不限速 | 同左 | 会员节点覆盖更多地区 | 时长套餐有效期内不限流量、不限速 |
响应头怎么读
看懂这几个响应头,大多数「为什么还是旧的」都能当场找到答案:age 很大而 max-age 更大,说明缓存还没过期;带了 stale-while-revalidate,说明第一次刷新拿到旧版、第二次才是新版,属于正常行为。
| 响应头 | 示例含义 | 排查用途 |
|---|---|---|
| cache-control: max-age=3600 | 缓存一小时 | 判断旧内容最多还会留多久 |
| cache-control: no-cache | 可以缓存,但每次要向源站确认 | HTML 页面的常用设置 |
| age: 86000 | 这份内容已在缓存里放了约一天 | 数值大说明很久没回源 |
| etag | 内容的版本标识 | 与源站对比是否同一版本 |
| stale-while-revalidate | 过期后先返回旧内容再后台更新 | 解释为何刷新一次后才变新 |
不同平台的清除入口与普通访客能做的事
不同服务的清除入口位置不同:Cloudflare 在站点的「缓存」菜单里;Vercel、Netlify 这类部署平台每次发布新版本会自动让旧缓存失效,一般不需要手动清除,出问题时重新部署一次即可;国内云厂商的 CDN 通常在「刷新预热」页面提交网址或目录。很多 CDN 还提供接口,可以在部署脚本的最后一步自动调用清除,避免每次发布后忘记手动操作。
如果你只是普通访客,能做的事情有限但也够用:先强制刷新,再清除这个网站的站点数据,然后换一个网络或连到另一个地区的节点再打开。如果换了地区之后就是新版,说明是你所在地区的边缘节点还没更新,耐心等一会儿或把截图和访问时间发给网站客服,告诉对方你看到的 age 与 cf-cache-status 数值,对方定位起来会快很多。
和就近节点、DNS 知识的分工
为什么不同地区会连到不同的边缘节点、同一个地址为什么能在全球各地同时响应,背后是任播与地理调度,原理见 任播 CDN 与地区判定。DNS 缓存不只影响网站更新,还关系到你的查询有没有绕开线路被本地网络看到,相关概念见 DNS 泄露详解。
排查时把这几层知识串起来:先用 DNS 工具确认连到的是哪台服务器,再用响应头确认是不是缓存,最后切换地区对比不同边缘节点。三步走完,旧页面藏在哪一层基本就清楚了,处理起来也就有的放矢。
常见报错速查表
| 现象 | 原因 | 解决办法 |
|---|---|---|
| 所有人都是旧版 | 源站未更新或服务器缓存 | 直连源站确认,清服务器缓存 |
| 部分地区是旧版 | 个别边缘节点未过期 | 按网址清除 CDN 缓存 |
| 样式脚本是旧的 | 文件名未变且缓存很长 | 文件名加内容哈希 |
| 强制刷新也无效 | Service Worker 接管请求 | 开发者工具里取消注册 |
| 连到旧服务器 | DNS 记录未过 TTL | 刷新 DNS 缓存,提前调低 TTL |
| 登录页面被缓存 | 缓存规则过宽 | 排除带 Cookie 的请求并清除缓存 |
高频问答
- 问:清除 CDN 缓存要多久生效?答:主流 CDN 通常几秒到几分钟全网生效,个别服务商需要更久,以服务商说明为准;
- 问:频繁全部清除有坏处吗?答:会让所有请求短时间内回源,源站可能扛不住,尽量按网址清除;
- 问:普通访客能清 CDN 缓存吗?答:不能,只能清自己的浏览器缓存和 DNS 缓存,CDN 缓存要等站长处理;
- 问:为什么换个网络就是新版?答:不同网络连到不同的边缘节点,各节点缓存的版本不同;
- 问:迁移服务器前要做什么?答:提前一两天把 DNS 记录的 TTL 调低,迁移完成后再调回;
- 问:开了 VPN 看到的版本不一样正常吗?答:正常,线路出口在另一个地区,访问会落到那个地区的边缘节点。
长期稳妥的做法
网站更新后仍显示旧页面,问题一定在某一层缓存里:先直连源站确认部署成功,再用 curl 看响应头判断 CDN 是否命中,切换地区对比不同边缘节点,然后依次排除浏览器缓存、Service Worker 和 DNS。长期来看,HTML 短缓存、静态资源加哈希长缓存、迁移前调低 TTL,能让大多数「旧页面」问题不再出现。把清除缓存写进发布流程的最后一步,再在发布后从两三个地区各打开一次首页,几分钟的检查就能替你挡掉大部分用户投诉。
刺猬VPN 采用 HTTPS+AES 加密传输,自定义用户名和密码即可匿名注册,不需要邮箱和手机号;免费节点永久免费、不限流量、不限速,适合偶尔从其他地区复查网站版本;时长套餐有效期内不限流量、不限速,适合经常发布、需要多地区核对的站长,一个账号支持多设备同时在线,按域名和 IP 的智能分流可以只让目标网站走线路。实际可用性取决于当前网络环境。
换刺猬VPN告别连接烦恼:一键连接、连接稳定
刺猬VPN提供永久免费节点,不限流量;无需邮箱,自定义用户名即可匿名注册。一个账号支持多设备同时在线,实际可用性取决于当前网络环境。