先给结论:静态响应与脚本渲染结果不同,通常不是死链扫描工具本身出错,而是你比较了两个不同阶段的页面状态。静态响应是服务器返回的原始HTML,脚本渲染结果是浏览器执行JavaScript之后的DOM。定位差异时,先确认扫描工具抓的是哪一种,再用同一URL分别固定这两种视图做对比,而不是直接判定某个链接是死链。
矛盾现象通常表现为:静态响应里某个链接指向404,但用浏览器打开页面时链接可点、可跳转;或者反过来,静态响应正常,渲染后链接被脚本替换成失效地址。这背后有两个成立条件完全不同的解释。
这两个解释的区分点在于:差异出现在“链接是否存在”,还是出现在“同一链接的状态码”。前者指向渲染时机,后者指向服务端响应策略。
在缺少完整日志或权限时,仍可执行一个最小动作:对同一个URL,分别保存静态响应正文和渲染后的DOM,然后只比较目标链接这一处。
如果静态响应里没有该链接、渲染后有,说明链接由脚本注入,静态阶段看到的404不能作为死链结论。如果两边都有同一链接但状态不同,问题更可能在服务端或路由层,下一步应直接请求该链接本身,而不是继续扫描整站。
以下证据可以帮助判断差异来源,但要注意它们各自还有别的合理解释。
这里有一个容易误判的点:某次抓取中目标链接请求量归零,不能单独证明它已被正确处理。归零还可能来自抓取频率限制、页面未被访问、脚本未触发,或该链接本来就不在抓取范围内。需要结合直接请求结果一起看。
假设某页面静态响应里有一个指向 /old-page 的链接,返回404;渲染后该链接被脚本替换为 /new-page,返回200。此时若只依据静态响应,会把 /old-page 记为死链;若只依据渲染结果,会认为一切正常。正确做法是把两个地址都记录下来,分别直接请求一次:/old-page 持续404,说明它确实是失效地址,只是页面上不再暴露;/new-page 返回200,说明替换生效。这个结果会影响下一步:前者需要决定是否保留重定向,后者不需要修复,但可以检查脚本替换是否覆盖了所有入口。
静态与渲染结果不同,不能直接推出“工具不准”“页面有死链”或“脚本必须执行”。它只能说明两种视图存在差异,差异原因需要上面那组证据来区分。另外,robots.txt 的抓取限制不等于可靠的索引移除,站点地图不保证收录,这些都与当前的状态差异判断无关,不能拿来解释链接为什么在两种视图里表现不同。若差异涉及多个搜索引擎,还需分别核查各自对脚本渲染的支持情况,不能用一个引擎的表现推断另一个。
把静态响应和渲染结果当成两条独立证据链来对齐,才能决定下一步是修脚本、改服务端响应,还是调整扫描方式。