你要是也遇到过这种情况,我以为91网页版没变化,直到我发现缓存管理悄悄变了(真相有点反常识)
你要是也遇到过这种情况,我以为91网页版没变化,直到我发现缓存管理悄悄变了(真相有点反常识)

前几天打开熟悉的网页版,心想“怎么一点变化都没有?”明明后台已经推了新内容、改了样式,刷新好几次页面还是老样子。后来花了点时间排查,才发现问题不在服务器,也不是我眼花——是缓存管理悄悄变了。结论有点反常识:网站“看起来没变”,有时不是因为网站没更新,而是因为浏览器或中间层在替你做了“保守缓存”。
下面把我排查到的关键点和实用操作整理出来,帮助你快速判断到底是哪一层在“偷偷缓存”,以及作为用户或站长该如何应对。
一、先判断症状:到底是哪一层在缓存?
- 页面刷新多次内容不变,但换设备或隐身模式能看到新内容:很可能是浏览器的缓存或服务工作线程(Service Worker)。
- 同事也看不到更新、但直接访问资源的特定 URL(如带版本号的静态文件)是新的:可能是 CDN 在缓存。
- 网络面板返回 304 Not Modified 或是 200 (from disk cache / memory cache):浏览器缓存占优。
- 打开 DevTools → Application → Service Workers 能看到已注册的 SW:如果存在,很有可能 SW 在拦截并返回缓存内容。
二、为什么会发生(反常识点)
- 多层缓存:现在网页除了传统的浏览器缓存、代理缓存,还常用 CDN 和 Service Worker。更新在服务器端生效,并不代表客户端一定会立刻获取到新资源。
- 服务工作线程更“聪明”:它能离线缓存、拦截请求并返回本地缓存的文件。这样用户体验很流畅,但也更容易导致内容滞后,尤其当 SW 的更新策略和页面更新策略不一致时。
- HTTP 缓存头可能被默认为“长时间有效”:一些站点为了提速,把静态资源设置了很长的 max-age;如果不配合版本号或缓存清理,就会长期拿到旧文件。
- CDN 自动化策略:有的 CDN 默认缓存设置 aggressive,而站点发布流程没有触发 CDN 清理(purge),结果用户还是从 CDN 拿旧文件。
三、作为用户,快速排查与解决(随手能做的) 1) 硬刷新或禁用缓存试试
- Windows: Ctrl + F5 或 Ctrl + Shift + R;Mac: Cmd + Shift + R。
- 在 Chrome DevTools 的 Network 选项里勾选 “Disable cache”,然后刷新(注意:只在 DevTools 打开时生效)。
2) 检查 Network 状态码
- 打开 DevTools → Network,刷新页面,看资源是 200、304 还是显示来自 disk/memory cache。304 表示服务器告诉浏览器资源没变;from cache/ disk 表示浏览器直接使用了本地缓存。
3) 查看并移除 Service Worker
- DevTools → Application → Service Workers,点击 “Unregister” 来临时移除。移除后再刷新看页面是否更新。
4) 清除站点数据(更干净)
- DevTools → Application → Clear storage → Clear site data(会删除缓存、IndexedDB、Service Workers 等,谨慎操作)。
- 或浏览器设置中清除缓存(可选择只清除特定站点的数据)。
5) 使用隐身/无痕窗口或更换浏览器/设备检验
- 如果隐身模式能看到新内容,那就是本地缓存或扩展影响。
四、作为站长/开发者,负责而不烦人的缓存策略
- HTML(页面)走短 TTL 或 network-first:页面通常需要尽快反映线上变更,设置较短的 max-age,或采用 network-first 的 Service Worker 策略。
- 静态资源(CSS/JS/图片)走长 TTL + 版本化:文件名带 hash(如 app.v1.2.3.js 或 app.abcdef.js),每次发布变更就换名,从而利用长缓存同时避免旧资源问题。
- 使用 ETag/Last-Modified 做二次验证:既能节省带宽,又能让浏览器按需从服务器确认是否更新。
- 当使用 CDN:把自动化的部署流程和 CDN 清理(purge)打通,发布时自动失效旧缓存。
- Service Worker 的生命周期处理:
- 在新 SW 安装时,考虑调用 self.skipWaiting()(配合消息机制慎重使用),并通过 clients.claim() 控制何时接管旧页面。
- 采用 stale-while-revalidate 或 network-first 策略区分 HTML 和静态资源,避免 HTML 被长期缓存导致页面不更新。
- 在 SW 中加入版本号或缓存名,当发布新版本时改变缓存名并在 activate 阶段删除旧缓存。
五、常见示例(思路,不是教条)
- Cache-Control 示例:
- HTML: Cache-Control: no-cache, must-revalidate, max-age=0
- 静态资源: Cache-Control: public, max-age=31536000, immutable(配合文件指纹)
- Service Worker 更新流程提示用户:
- 在 SW 检测到新版本后,可以通过客户端通知用户“有新版可用,点击刷新以更新页面”,这样既控制了体验,也避免强制刷新带来的突兀。
六、一句话总结(适合贴到日志或 README)
- 如果站点已经部署但你看不到变更,不要急着怀疑自己或服务器:先查浏览器缓存、Service Worker、以及 CDN 缓存;这些地方更可能默默“替你做决定”。
























