入口页面返回 200 不代表整条链路健康。深层链路失效通常发生在“入口可达、内页不可达”这一段,定位断点的关键是先判断失效发生在服务器响应层还是站内链接层,再分别用直接请求和爬虫路径两种方式复现。如果直接请求内页也返回 404,问题在服务端路由或内容状态;如果直接请求正常、只有沿链接点击才 404,问题在链接生成或重写规则。下面按这两种条件给出不同的排查选择和动作。
第一种条件:直接访问深层 URL 时服务器就返回 404 或 410。这说明请求还没进入链接跳转环节,断点在服务端。此时优先核对路由配置、内容是否被删除或改状态、以及 URL 重写规则是否覆盖了该层级。第二种条件:直接访问深层 URL 返回 200,但从前一层页面点击链接过去变成 404。这说明资源本身存在,断点在链接生成或路径拼接。此时优先核对模板输出的 href、相对路径基准、以及是否存在大小写或尾斜杠差异。
判断依据可以这样取:用不带 Referer、不带 Cookie 的裸请求访问深层 URL,记录状态码。若裸请求 200,而带完整跳转链的请求 404,基本可锁定链接层;若裸请求本身就是 404,则不必再查链接模板,直接查服务端。这一步的动作会决定后续排查方向,做错方向会浪费大量时间在无关层。
确认断点在服务端后,按层级逐段缩小范围。从入口路径开始,每次只增加一个路径段,观察状态码在哪一段由 200 变成 404。假设入口是 /a/ 返回 200,/a/b/ 返回 404,那么断点就在 b 这一层的路由或内容映射上,而不是整站路由失效。这个比较方法不需要真实数据,只是用逐段请求把范围从“整条链路”压到“单个路径段”。
定位到具体段后,检查三类常见原因:内容被改为草稿或下架、路由规则只匹配固定层级、重写规则对带参数或带尾斜杠的路径不生效。若发现是内容状态问题,恢复发布后再次裸请求该深层 URL,若仍 404,说明还有缓存或路由层未同步,需要继续往下一层查。若恢复后 200,则断点确认在内容状态,链接层无需再动。
需要留意的例外:有些站点对不存在的路径返回 200 并渲染一个“软 404”页面。这种情况下状态码正常但内容无效,逐段请求法会失效,必须改为比对页面主体内容是否与预期资源一致。软 404 会让状态码判断失去意义,所以状态码和内容要一起看。
确认断点在链接层后,抓取前一页面的 HTML,检查指向深层的 href 实际输出值。常见偏差是相对路径基准错误,例如模板里写的是相对地址,但页面被部署在子目录下,浏览器解析出的绝对路径与真实路径不一致。另一个常见偏差是尾斜杠策略不统一:链接指向不带斜杠的地址,而服务器只对带斜杠的地址返回 200。
动作上,把页面里实际输出的 href 复制出来,与裸请求验证过的正确 URL 逐字符对比,包括协议、大小写、斜杠和查询参数。若两者不一致,修正模板或重写规则后重新抓取该页面,确认 href 已变为正确值,再沿链接点击验证状态码。这个动作的结果直接决定下一步:href 修正后仍 404,说明服务端对目标路径也不认,需回到服务端层复查;href 修正后 200,则断点闭环。
例外情况:链接由前端脚本动态拼接时,静态抓取的 HTML 里看不到真实 href,需要查看渲染后的 DOM 或脚本逻辑。此时用静态 HTML 判断会得出错误结论,应改用渲染后结果作为依据。
单次请求的结果可能受缓存、CDN 或临时故障影响。更稳的做法是把裸请求结果、站内链接实际输出、以及服务器访问日志三者的时间戳对齐,看同一路径在同一时间段内是否稳定返回同一状态码。若日志里该深层路径长期没有请求记录,不能直接断定链路正常,也可能是爬虫从未沿该链接进入,或链接被 robots.txt 限制抓取。robots.txt 的抓取限制不等于可靠的索引移除,它只约束抓取行为,不改变页面本身的可达性。
站点地图里列出了深层 URL,也不代表它一定可被抓取或收录,站点地图只是提交线索。验证时应以实际请求结果为准,而不是以站点地图是否存在该条目为准。若发现链接层正常、服务端正常,但日志显示从未被访问,需要检查是否存在阻止抓取的规则或链接未被任何可达页面引用。
如果以上四步都通过,说明断点已修复;若某一步失败,回到对应层级继续缩小范围。整个过程中,状态码、链接输出值和日志三者要相互印证,任何单一信号都不足以单独证明处理正确。