站点运营

站点运营:CDN 与缓存策略自查,别让旧缓存把新内容盖住

内容更新后,访客和蜘蛛看到的还是旧版本,问题往往出在缓存层。本文梳理浏览器、CDN、反向代理、对象存储等常见缓存环节,给出缓存键、TTL、HTML 缓存风险与刷新验证的实操清单,帮助运营在改版和日常发布中减少“改了没生效”的反复排查。

站点运营

站点运营:CDN 与缓存策略自查,别让旧缓存把新内容盖住

网站上线新内容、改了标题或替换了图片,自己在后台明明看得见,访客和蜘蛛抓到的却还是几天前的版本——这类问题很多时候不是部署失败,而是缓存层没刷新干净。CDN、反向代理、对象存储、浏览器缓存,甚至框架自带的页面缓存,任意一层留下旧副本,都会让“更新”变成“看起来没更新”。

缓存问题为什么容易被误判

缓存的设计目标就是少回源、快响应,所以它天然倾向于把旧内容多留一会儿。运营侧的直觉是“我改完就该全网一致”,工程侧的现实是“每层缓存有自己的过期时间和失效条件”。两端预期不一致,就会出现反复的排查拉扯:运营说改了,技术说源站上是新的,最后发现问题出在边缘节点或浏览器本地。

值得逐项确认的几个点

缓存键与参数处理

缓存键决定了哪些请求算作同一个页面。带查询参数的 URL、大小写差异、结尾斜杠、编码头差异、Cookie 差异,都可能被算成不同缓存对象,也可能被错误地合并。需要确认:带推广参数的访问不会被当成独立副本反复回源,同时也不会因为忽略关键参数,把不该共用的内容混在一起。

TTL 与分层过期

HTML、接口响应、静态资源通常不该共用同一个 TTL。HTML 适合较短过期加主动刷新,带指纹的静态资源可以长过期。如果所有类型一刀切,要么更新慢,要么回源压力大。

HTML 被长时间缓存的风险

把整页 HTML 长期缓存,是改版和栏目调整时最容易出问题的地方。页面结构、内链、甚至标题都可能长期停留在旧版本,蜘蛛抓到的自然也是旧版本。相对稳妥的做法是让 HTML 保持较短缓存,并在发布时主动提交刷新,而不是等它自然过期。

刷新是否真的生效

提交刷新之后需要实际验证:用不同网络、无登录状态的方式请求同一个 URL,对比返回内容里的版本标识或时间戳,而不是只看后台预览页面。预览正常不代表边缘节点已经是新版本。

一次可执行的自查流程

  1. 列出站点涉及的所有缓存层:浏览器、CDN、反向代理、应用层缓存、对象存储。
  2. 为每层记录当前策略:缓存键怎么算、TTL 多长、是否缓存 HTML、是否忽略查询参数。
  3. 挑一个刚更新过的页面,用未登录浏览器和无痕窗口分别访问,记录返回的版本特征。
  4. 发布一次小改动,观察各层在多长时间内变成新版本,记录实际生效时间。
  5. 对长期没动的栏目页、专题页做抽查,确认没有停留在旧模板结构上。
  6. 把刷新动作写进发布清单:谁提交、多久后验证、异常时怎么回滚。

常见误区

  • 只用强刷判断:本地强刷只绕过浏览器缓存,绕不过 CDN 和应用层缓存。
  • 依赖时间被动过期:需要紧急修正错误内容时,等 TTL 自然到期并不合适。
  • 忽略回源压力:一次性刷新全站,可能把请求集中打到源站。
  • 把缓存和索引混为一谈:蜘蛛抓到旧版本,不一定是索引没更新,也可能是它拿到的就是旧副本。
把“更新生效”当成一个需要验证的流程,而不是一个默认结果,缓存引发的返工能少掉一大半。

把验证变成固定动作

缓存策略不需要频繁调整,但有几个时机值得重新确认:站点改版、更换 CDN 或对象存储、调整 URL 结构、上新模板,以及出现内容事故之后。每次确认留下简短记录,后续交接和排查都会省力。对搜索蜘蛛来说,稳定的响应比极致的速度更重要——让同一个 URL 在不同时间返回可预期的内容,本身就是在降低抓取和发现环节的不确定性。