先别急着改链接或清缓存。拿一个你手头有权限的最小对象——比如某个栏目页或详情页的HTML源码——固定同一个请求,分别记录CDN、反向代理、应用层和模板层看到的链接版本,找出哪一层最先出现差异。缺少完整日志权限时,这个动作仍然可做,但只能定位到“差异出现在哪一层”,不能直接断定根因或影响范围。
多层缓存返回不同版本,本质是同一URL在不同节点上输出了不同的内链集合。要定位一致性,先要有基准。选一个页面,用同一路径、同一参数、同一UA,在不同层各取一次响应,只比较与内链相关的片段,比如导航区块、正文相关推荐、分页链接。
如果只能拿到其中一两层,就把能拿到的层按时间戳排列。差异出现的层越靠前,越可能是生成逻辑问题;差异只出现在边缘,才更可能是缓存键或刷新策略问题。
不同版本的内链差异有几种典型形态,指向不同原因。判断时不要只看“链接不一样”,要看差异是否有规律。
一个可执行的验证动作:对同一URL连续请求多次,记录每次返回的链接集合。如果集合在几次请求内稳定切换,而不是随机变化,说明存在多个缓存副本,而不是每次实时生成。这个结论只说明“存在多版本”,不能说明哪个版本是正确版本。
没有CDN后台、没有应用日志、没有回源配置权限时,仍然可以做三件事,但每件事的结论边界不同。
Age、Cache-Control、X-Cache一类字段是否存在及变化。这些字段能提示响应是否被某层缓存,但不能证明缓存键的构成。这些动作能帮你把问题交给有权限的人时,带上“哪一层、什么时间、什么请求、什么差异”的具体证据,而不是只说“内链不一致”。
假设某栏目页在节点A返回10条相关链接,在节点B返回8条,其中2条指向旧路径。你先固定请求路径和UA,分别从两个节点取HTML,确认差异只在推荐区块。然后检查该区块是否由服务端查询生成。如果是,再看两个节点的回源时间是否不同。若节点B的回源时间早于最近一次链接配置发布,那么“旧路径”更可能是未刷新,而不是生成逻辑错误。此时下一步是推动该层刷新并再次采样;如果刷新后仍不一致,才需要继续查配置分发或缓存键。
这个例子里,数字只用于说明比较方法,不代表任何真实站点的表现。关键是把“不同版本”拆成“哪一层、哪个时间点、哪组链接”,否则后续动作没有依据。
定位到差异层之后,动作要匹配层,而不是一律清缓存。
每一步做完后,都要回到同一个基准请求重新采样。如果差异消失,说明该层是直接相关层;如果差异仍在,说明还有另一层在输出不同版本。不要因为某次请求恢复正常就认为问题已解决,多版本缓存的特征之一就是间歇性一致。
最后提醒一点:抓取量或某次请求的链接数量归零,不能单独证明缓存处理正确,也可能是采样时间、节点选择或请求头变化导致的。定位一致性问题的核心,是让同一请求在不同层之间的差异可比较、可复现、可交接,而不是追求一次动作就消除所有版本。