先给结论:不要试图把两个版本“统一成一个”,而要先确认差异来自服务端输出、边缘缓存还是前端渲染,再决定以哪个版本作为内链评估基准。具体做法是固定一个可复现的请求条件,逐层剥离变量,直到两个结果收敛或差异原因被定位。
同一 URL 在移动端与桌面端、登录与未登录状态下返回不同内容,常见原因只有两类,但处理方式完全相反。
解释一:服务端按请求特征动态输出。 服务器读取 User-Agent、Cookie、Accept-Language 或登录态后,返回不同的 HTML。此时差异存在于源站,爬虫、缓存和前端脚本都只是被动接收。
解释二:同一份源站 HTML 被不同中间层改写。 边缘节点按设备类型返回不同缓存副本,或前端脚本在登录后替换了导航与正文链接。此时源站输出一致,差异产生在传输或渲染阶段。
这两种解释会导向不同的内链修复动作:前者要改服务端模板或渲染策略,后者要改缓存键或前端注入逻辑。判断错方向,改完一处另一处仍会复现。
最有效的证据来自“控制变量后的原始响应对比”,而不是浏览器里看到的最终画面。按下面顺序取证据,每步只改一个条件。
关键判据是:差异出现在原始 HTML 里,还是只出现在渲染后的 DOM 里。 前者是服务端或缓存问题,后者是脚本问题。这一步决定后续动作,不要跳过。
假设某列表页在未登录时输出 20 条内链,登录后输出 8 条并追加“我的收藏”入口。若只对比浏览器截图,会误判为前端隐藏。实际取原始 HTML 后发现两份响应体本身就不同,说明服务端按登录态裁剪了列表。此时若把内链评估基准定为未登录版本,登录用户的抓取与点击路径就与评估结论脱节;反之亦然。合理动作是先明确“对内链负责的版本”是哪一个,再让模板、缓存键和站点地图指向同一版本。这个假设只用于说明比较方法,不代表任何具体站点现状。
不同搜索引擎对动态渲染、缓存和登录态内容的处理方式需要分别核查,不要用一家的表现推断另一家。
如果证据指向服务端动态输出,先确认该差异是否属于有意设计:面向登录用户裁剪导航是产品决策,但内链评估必须绑定到与抓取一致的版本上,否则结论不可复查。如果证据指向缓存键缺失,动作是让缓存按设备或登录态分键,再重新取一次原始响应验证两份内容是否按预期分离。如果证据指向前端注入,动作是检查脚本是否在渲染后替换了链接,并确认替换逻辑是否对所有目标环境一致。
每次只改一个变量,改完立刻重取对应条件的原始响应,与改动前的存档逐条比对链接集合。只有当下一次请求在两个条件下都返回你预期的版本,这次内链对照才算闭环。