很多站长都有过这种困惑:明明在后台把文章改了、价格更新了、联系方式也换了,可隔了几天去搜,答案里引的还是旧的那一版。第一反应往往是“稿子没写好”或者“机器没爬到”。但真正的问题,常常藏在中间那层——你启用的全页缓存、CDN 边缘节点、甚至是 PHP 自己的字节码缓存,正把上线前的旧 HTML 牢牢端着,一次次递给来访的抓取程序。你以为改完了,机器读到的却还是昨天甚至上个月的页面。
一、改了等于没改:内容新鲜度卡在缓存上
答案引擎判断一个站点“是否还在认真维护”,靠的是反复来访时读到的版本有没有变化。你每周补数据、每月改结论,这些动作本该转化成稳固的被引用资格。可一旦抓取程序每次拿到的都是缓存里的旧页,它就会形成一个判断:这个站点的内容长时间没动。于是你新写的硬事实、新补的口径、新纠的错误,全被挡在门外,引用位自然落到了隔壁那个每次都递新鲜页的同行手里。
这里说的“递旧页”,不是页面打不开,而是打开正常、内容却是旧的。肉眼访问有时也中招,只是你清了浏览器缓存就以为没事;而抓取程序那边没有“顺手清一下”的习惯,它认死理,缓存给什么它读什么。内容新鲜度这一关,就这么悄无声息地漏了。
二、三处最常藏旧页的地方
第一处是全页缓存。很多站点为了扛并发,会在服务器层把渲染好的 HTML 整页存下来,下次直接吐。这本身没问题,问题在于更新文章后没有触发清理,缓存键还指着旧文件。结果新稿发布半小时,机器人来访读到的仍是发布前的版本。
第二处是 CDN 边缘节点。静态资源长缓存合理,但如果你把带正文的页面也按“默认缓存规则”推到边缘,且没配主动清除(purge)接口,那么不同地区的节点会各自抱着一份旧快照,短则几小时、长则按 TTL 算几天。你在本机改了,上海节点和广州节点还在发旧货。
第三处最容易被忽略:应用层自己。PHP 的 OPcache 把编译后的代码缓存住,模板改了没重启,全站读的就是旧逻辑;有些站点还用 Redis 之类的对象缓存存了“渲染结果”,文章表更新了,缓存里的 HTML 却没跟着变。这类问题肉眼难发现,因为后台看到的是新数据,前端吐出来的却是旧拼装。
三、为什么这会悄悄伤到可被引用的资格
新鲜度不是装饰。当一个来源在多次回访里都呈现稳定更新的迹象,机器才更愿意在回答“最新”“今年”“currently”这类带时间意的查询时引用它。反之,旧页长期霸屏,会被当成停更或低活站点,权重和信任都往下走。更现实的是,你刚补的那段独家数据、刚纠的那个错误口径,正因为卡在缓存后头,始终没机会变成可被引用的内容。
更麻烦的是同一网址新旧并存。你本地是新版、缓存是旧版,canonical 指向没变、ETag 却对不上,抓取程序可能干脆保守处理,宁可不引,免得把前后不一致的段落搬进答案惹麻烦。你辛辛苦苦织进正文的实体信息、可核验的口径,全堵在缓存这关,到不了机器眼前。
四、上线前四步自查,把开关握在自己手里
与其事后猜,不如发布时就过一遍。第一步,用命令行直接看响应头:关注 Cache-Control、Age、X-Cache 这几个字段,Age 很大或 X-Cache 显示 HIT,说明机器人拿到的是缓存货。第二步,改完内容主动调一次清除接口,全页缓存清、CDN 节点清、对象缓存也清,别只清一处。第三步,给真正要被读的正文页设短 TTL 甚至 BYPASS,把长缓存留给图片、样式这类不变资源——提速和新鲜度本来就不该抢同一份配置。第四步,翻抓取日志,拿机器人实际拿到的 HTML 和你编辑的版本做 diff,确认它读到的就是你想要的这版。
对做 geo优化公司 这行的人来说,这套自查尤其值得固化成发布清单:客户托你维护的站点往往叠了多层缓存,任何一层漏清,前面写的优质内容就白费一半。把“发布即清缓存、清完即验抓取”写进流程,可被引用的正文才真正算送达。
五、两个常见的翻车现场
有一家做本地服务的站,把报价从“面议”改成了明码实价,本想接住“多少钱”这类高意图查询。结果 CDN 按默认规则缓存了列表页,三天里机器人读到的还是“联系客服”。等缓存过期,这波时效流量早被竞品接走了。
另一家是模板升级后忘了重启 OPcache,全站连续一周吐旧版头部,结构化数据里的发布时间还停在上月。答案引擎回访时发现“最后更新”没动,直接把它归进低活来源,新发的几篇干货引用率集体下滑。两件事的根因都不是稿子,是缓存没让路。一套像样的缓存策略,本该在提速的同时给正文留一条实时通道。
六、缓存不是敌人,关键是怎么分层
说到底,缓存该留——它决定页面打开快不快,而速度本身也是可读性的一部分。真正要做的,是把“会被引用的内容”和“该提速的静态资源”分开对待:正文走实时或极短缓存,让抓取程序每一次来访都拿到你最新的判断;图片、字体、脚本放心长缓存。清晰的缓存策略,比反复重写全站更能保住你的内容新鲜度和被引资格。下次改完稿子别急着关页面,先确认中间那层有没有把旧页还端着。