可行边界是:不碰模板,只改“模板之外、请求到达模板之前”的那一层。具体包括服务器或反向代理的跳转与状态码、robots.txt、站点地图,以及能独立于模板输出的错误页。这些动作能改变死链对抓取和用户体验的暴露面,但改不了模板里写死的链接本身,也不能单凭某个统计归零就断定问题已解决。
遗留系统改模板受限,通常意味着链接生成逻辑嵌在编译产物、老框架或第三方组件里。此时可动的对象只有三类:请求进入应用前的路由层、应用外部的爬虫协议文件、以及不依赖模板的静态或独立错误页。动不了的是页面正文里那些由模板拼出的<a href>,它们会持续产生指向失效地址的请求。
因此判断取舍的第一步不是“修不修”,而是“这条死链的请求最终落到哪里”。如果它落到一个能配置规则的网关或反向代理,你就有改写空间;如果它直接由模板渲染后交给浏览器,而你又无法改模板,那就只能靠外部协议缓解,而不是消除。
保留:当失效地址仍有外部链接、仍有用户书签,或它对应的内容只是换了位置时,保留一个指向新地址的跳转比直接断掉更合适。前提是你确认新地址稳定,且跳转是永久性的。若旧地址背后已无对应内容,保留只会把用户和爬虫引向另一个死链。
改写:当模板无法改、但网关可以改时,把旧路径在网关层重写到有效路径,是边界内最直接的动作。它的前提是路径规则可枚举、可匹配,且改写后返回的是正常内容而不是错误页。若规则过于发散,逐条匹配会迅速失控。
退出:当旧地址既无内容也无外部价值,且继续保留只会放大无效请求时,让它返回明确的失效状态、不再跳转,是合理的退出。前提是你接受这部分流量彻底消失,并且不再指望它带来任何入口价值。
三者的分界不在“死链多少”,而在“旧地址是否还有可承接的目标”。没有承接目标时,改写和保留都是把问题往后推。
如果只有网关权限,最小动作是:把已确认有替代目标的旧路径,配置成永久跳转;对没有替代目标的路径,返回明确的失效状态而不是软跳转到首页。执行后,下一步应观察这些请求是否还持续出现、出现时返回什么状态,而不是立刻认为影响已消除。
如果有 robots.txt 写入权限,可以限制对明显无效路径的抓取。但需要明确:robots.txt 的抓取限制不等于可靠的索引移除。被限制抓取的地址仍可能因外部链接而保留在索引里,只是内容不再被重新抓取。所以它适合减少无效抓取,不适合当作删除索引的手段。
如果能独立发布站点地图,可以把有效地址集中列出,帮助发现入口。但站点地图不保证收录,它只是提交线索。对死链问题而言,站点地图的价值在于让有效页面更容易被找到,而不是让失效页面消失。
如果只能改独立错误页,最小动作是让失效请求返回清晰的状态和可读的提示,并给出站内有效入口。它改善的是用户遇到死链后的去向,不改变死链本身的数量。
请求量下降、某个日志里的死链计数归零,都不能单独证明处理正确。它们还有别的解释:爬虫暂时降低了抓取频率、日志轮转丢失了记录、监控口径变了、或者请求被上游拦截而没有到达记录层。要把现象和处理动作对应起来,需要同时看返回状态、请求来源和是否仍有外部链接指向旧地址。
同理,HTTPS 不保证安全无漏洞或排名,它和死链处理是两件事,不要用启用加密来替代对失效路径的判断。不同搜索引擎对 robots.txt、站点地图和状态码的支持与处理方式需要分别核查,不能拿一个渠道的表现推断全部。
假设某遗留系统无法改模板,但网关可配置、robots.txt 可写、错误页可独立发布。可按以下顺序判断:
这个顺序的边界很清楚:它处理的是请求到达模板之前的那一层。模板里写死的链接仍会继续产生请求,你只能改变这些请求被如何回应,不能改变它们被生成。接受这个边界,才不会把“外部缓解”误当成“已经修好”。