结论先行:当遗留系统不允许改模板、也不允许改路由层时,你仍能在“入口层”和“响应层”做有限调整,但边界很清楚——能改变爬虫看到什么、能改变用户看到什么,却很难改变系统内部真实的资源状态。判断走哪条路,先看一个条件:这些死链是“对外暴露的旧地址”,还是“系统内部仍在生成的新坏链”。前者可在入口层收敛,后者只能靠外部隔离,且会持续复发。
如果业务已经迁移,旧路径不会再产生新链接,只是历史页面、外部引用、旧站地图里还留着它们,那么调整空间最大。此时不必碰模板,重点是把“已知坏地址”映射到“仍然有效且语义接近的地址”。
可行动作是维护一份显式映射表,在反向代理或网关层做 301。判断依据是:目标页与原页主题一致,且目标页本身返回 200。做完这一步,下一步要看日志中这些旧路径的命中是否下降、对应新路径的抓取是否上升;如果旧路径命中不降,说明还有未纳入映射的变体,需要继续补表,而不是急着改模板。
例外:如果旧地址带有查询参数或大小写变体,映射表必须逐条覆盖,不能用一条通配规则吞掉所有情况,否则会把正常参数页也重定向走。
如果坏链是系统运行时动态拼出来的,比如列表页仍在输出已下架资源的链接,那么入口层重定向只能治标。每重定向一次,系统下次还会再生成同样的坏地址。这种情况下调整边界收窄为“隔离”而非“修复”。
可以做的动作是在网关层对已知坏链前缀返回 410 或 404,并确保返回的是真实状态码而不是软 404 页面。判断依据:用不带 JS 的请求直接看响应头状态码,而不是看页面文案。做完后观察两点——用户是否还能从站内导航到这些地址,以及外部引用是否仍在增加。如果外部引用持续增加,说明问题在站外,需要另行联系来源方,而不是继续在站内加规则。
需要提醒的是,robots.txt 里加 Disallow 只是阻止抓取,不等于把已收录地址移除;它甚至可能让爬虫无法看到 404 状态,反而延长旧地址的存在时间。所以不要用抓取限制替代状态码处理。
不要凭感觉判断属于哪种条件,用一组可区分的证据:
这三条要一起看。单看“某天请求量归零”不能证明处理正确,也可能只是爬虫暂时降低了访问频率,或该地址本来就没有外部引用。把请求量下降当成修复成功的唯一证据,容易误判。
假设某站点旧商品路径为 /item/123,新路径为 /product/123,模板不可改,但网关可配。若旧路径不再生成,就配一条 301 映射,把 /item/ 前缀指向 /product/,并逐条校验目标页返回 200。若旧路径仍在被系统输出,则改为对 /item/ 下已确认失效的 ID 返回 410,同时在前端入口处下线这些链接的展示位。前者结果应体现为旧路径命中逐步转移到新路径;后者结果应体现为坏链不再从站内被点击,但站外引用可能仍在,需要单独处理。
无论走哪条路,下一步都由“状态码是否真实、目标页是否有效、来源是否仍在新增”三者决定。状态码真实且目标页有效,就可以把注意力转向站外引用;来源仍在新增,就回到系统侧寻找生成点,即使模板不能改,也要确认是否有配置、数据或接口层可以关掉输出。站点地图可以辅助发现旧地址,但它不保证收录,也不保证移除,所以不能把它当作修复手段。HTTPS 同理,它不解决死链本身,也不保证排名或安全无漏洞。不同搜索引擎对 410、301 的处理节奏和抓取限制的支持情况并不一致,需要分别核查,而不是套用同一套预期。