入口页面能被抓取和访问,不代表第三层、第四层页面还能沿着链接被走到。深层链路失效通常有两种解释:一是链接本身在某层被截断,二是链接存在但目标页被某个条件挡住。区分二者的关键动作,是从入口页出发逐层跟踪一条真实路径,记录每一跳的状态码、最终地址和可抓取性,直到第一次出现偏离的位置,再判断这是链接层问题还是目标页处理问题。
入口页面正常,可能只是它自己能返回 200,也可能包括它能被抓取、能被解析链接、能传递权重。这几种正常并不等价。如果只验证了入口页可访问,就把它当作整条链路健康的证据,后面的排查会一直找不到方向。
一个可区分的证据是:入口页的链接在源码里是否存在。如果链接存在,而目标页无法到达,问题更可能在目标页的响应或访问控制;如果链接本身缺失或被改写,问题就在链接生成环节。这个判断不需要看整站,只需要抽一条完整路径。
链接被截断的常见表现是:某一层页面里的链接指向了错误地址、参数被吞掉、相对路径拼错,或者链接被脚本延迟注入而抓取时看不到。这类问题的特征是,沿着同一路径再走一次,断点位置稳定复现。
目标页被挡住的常见表现是:链接地址正确,但访问时返回 403、404、重定向到无关页,或者需要登录、需要特定 UA、需要特定地区才可见。这类问题的特征是,链接本身没问题,换一个来源访问同一地址,结果可能不同。
两者的排查顺序不同。先判断是哪一类,能避免在错误的方向上反复改链接。
从入口页选一条深度至少三层的路径,逐跳记录以下内容:当前页地址、该页中指向下一跳的链接地址、请求该链接后的状态码、最终落地地址、落地页是否可被抓取。把记录写成短清单,不要凭印象判断。
这个清单的价值在于,它把“深层链路失效”拆成了可分别验证的几种原因,而不是笼统归为内链没做好。
假设入口页 A 正常,A 中链接到 B,B 中链接到 C,C 无法访问。逐跳记录后得到:A 到 B 正常,B 到 C 的链接地址正确,但请求 C 返回 403。此时可以判断,问题不在 A 和 B 的链接生成,而在 C 的访问控制。下一步应检查 C 是否对抓取工具或未登录状态返回 403,而不是继续修改 B 的内链结构。
反过来,如果 B 到 C 的链接地址被改写成了带错误参数的地址,那么问题在 B 的链接输出,下一步应检查模板、脚本或参数拼接逻辑,而不是去调 C 的访问权限。两种结果指向完全不同的修复动作,这正是先定位断点的意义。
修复某一跳之后,不要只验证那一跳。重新从入口页走完整条路径,确认每一跳的状态码、最终地址和可抓取性都符合预期。因为修改链接或访问控制,可能让原本正常的相邻层出现新的重定向或屏蔽。
如果路径较长,可以固定抽两到三条不同深度的路径做对照。一条路径恢复正常,不能证明所有深层链路都恢复;但一条路径仍然失败,足以说明修复没有覆盖到真正的断点。
需要留意的是,站点地图里列出深层页面,并不保证这些页面能被沿着内链走到;robots.txt 的限制也不等于可靠的索引移除。这些信号只能作为辅助,不能替代逐跳验证。
这个顺序的作用是让每次排查都从同一条路径开始,减少因为换页面、换工具而得到不一致结论的情况。深层链路失效往往不是整站同时坏掉,而是某一层的一个条件没有满足;找到那个条件,修复才有明确边界。