排除缓存造成的假象,核心做法是让“当前实际返回的 HTML”和“你正在看的页面”分离:先用带随机参数的 URL 或强制刷新获取一份新响应,再直接查看这份响应里的链接代码,而不是只看浏览器渲染后的页面。若两者不一致,说明你看到的很可能是缓存副本,而不是网站内链结构的真实状态。
浏览器会把 HTML、CSS、JavaScript 执行后合成一个页面,你右键看到的链接、开发者工具 Elements 面板里显示的节点,可能已经被脚本改写。缓存又会在中间再叠一层:CDN 边缘节点、反向代理、页面缓存插件、浏览器本地缓存,任何一层返回旧副本,都会让内链看起来“没更新”。
判断方法很直接:查看网页源代码(不是 Elements 面板),搜索目标链接。如果源代码里没有、渲染后却有,问题在脚本注入;如果源代码和渲染后都没有,但你此前明明见过,问题更可能在缓存或发布流程。这个区分决定了后面该清缓存还是改代码。
方案一:加查询参数试探。在地址后追加 ?v=20240601 这类随机值再访问。它会让多数缓存层把它当成新资源,从而回源取最新 HTML。代价是它只验证“回源后是什么样”,不改变真实用户访问的 URL,也不解决缓存本身的问题。适用条件是:你想快速确认源站输出是否正确,且不想动线上缓存配置。
方案二:主动清理并等待缓存失效。在 CDN、反向代理或缓存插件里对该页面执行清除,再按缓存规则等待重新回源。代价是操作依赖你对缓存链路的了解,清错层级可能无效,清太广可能短时增加源站压力。适用条件是:你已经确认源站输出正确,只是边缘或本地仍是旧副本。
选择顺序建议是:先用方案一确认源站,再决定是否执行方案二。若加参数后内链正确,说明源站没问题,清缓存即可;若加参数后仍不正确,清缓存没有意义,应回到发布流程或模板代码排查。
href,记录它是否存在。响应头里的 Age、X-Cache、CF-Cache-Status 等字段能提示是否命中缓存,但不同服务商字段名不同,需要按你实际使用的服务分别核对。它们只是线索,不是唯一结论。
内链没出现,不一定都是缓存。可能是模板条件判断没覆盖该页面,可能是链接由 JavaScript 异步插入,也可能是发布后构建未完成。反过来,缓存也不只影响 HTML,还可能影响内链指向的目标页,让你看到旧页面里的旧链接。
另外,robots.txt 的抓取限制不等于可靠的索引移除,站点地图不保证收录。这些属于抓取与索引层面的问题,和缓存假象是两回事,排查时不要混在一起下结论。
下一步:挑一个你怀疑被缓存的内链页面,按上面的四步做一次记录,把“源代码是否有链接”和“加参数后是否变化”两个结果写下来,再决定是清缓存还是改模板。