可行边界在于:不改模板的前提下,你只能调整域名层与请求层的映射关系,不能改变页面输出本身。因此先判断一件事——问题出在“URL 与内容的对应关系”还是“页面内部结构”。前者仍有余地,后者基本无解,除非接受换域名或加反向代理层。
遗留系统改不了模板,通常分两种。第一种是模板文件动不了,但路由、重写规则、站点配置还能改;第二种是整个应用被打包死,连路由都在代码里硬编码。这两种的边界完全不同。
判断依据很直接:你能不能在不触碰模板的前提下,让同一个内容通过另一个 URL 返回 200 状态。能,就属于第一种,调整空间集中在域名与路径映射;不能,就属于第二种,剩下的动作只有外围层介入。
一个假设例子:某系统所有文章都在 /article.php?id=123 下输出,模板里没有 canonical 标签,也无法添加。若服务器允许重写,你可以让 /topic/123 与旧地址同时返回同一内容,再在响应头层面表达首选地址。若重写也不允许,这条路就断了。
这种情况下,可动的层面包括 URL 重写、响应头、站点地图和 robots.txt。它们都不需要碰模板。
这里有一个容易误判的点:robots.txt 的抓取限制不等于可靠的索引移除。被禁止抓取的 URL 仍可能因外部链接而出现在结果中,只是摘要信息可能过时。若目标是让旧地址退出索引,正确动作是让它返回 301 或 410,而不是写进 robots.txt。
站点地图同样不保证收录。它只是提交候选地址,是否处理取决于对方。所以把站点地图当成“提交即生效”的工具,会在遗留系统上浪费大量时间。
如果应用内部完全冻结,你还能做的是在它前面加一层可控组件,例如反向代理或边缘规则。这一层能做的是改写请求路径、补充响应头、按条件返回状态码。
但要注意边界:外围层能改变 URL 与状态码,却改不了页面正文里的链接、表单目标和资源引用。如果模板输出的内链仍指向旧参数地址,外围层无法修正这些链接,除非再做一次响应体替换——而响应体替换在动态页面上风险很高,容易破坏脚本或缓存。
因此第二种条件下的取舍是:要么接受旧地址长期存在,只保证它可访问且不被误判为重复;要么在外围层做有限重定向,把能识别的入口导向新地址,同时接受部分内链仍指向旧地址。
具体动作是:挑一个代表性页面,手动构造一个候选新地址,观察它是否返回与旧地址相同的内容和状态码。
这个动作的结果直接决定下一步:能双地址返回,就继续做规范化;不能,就不要在站点地图和 robots.txt 上继续投入,因为那解决不了内容对应关系的问题。
在遗留系统上,以下动作常被当成“调整”,实际超出了边界:
这些动作的共同问题是:它们改变的是外围信号,而不是 URL 与内容的对应关系。当核心问题在后者时,外围信号只能缓解,不能解决。
最后要说明适用条件:以上判断成立的前提是你能够观察到响应状态与正文差异。如果连响应头都被中间层统一改写,那么可用的判断依据会进一步减少,此时更稳妥的做法是先确认哪一层在改写响应,再决定是否继续调整。