先给结论:不要追求把每个旧地址都强行配到一个新页面。更稳妥的做法是先把旧地址按“内容是否还成立”分成三类——有等价新页的做单点跳转,内容合并的做聚合跳转,内容已废弃的返回410或落到最相关的上级栏目页。映射表要能解释每一行的判断依据,而不是只写新旧两个字符串。
假设你手里有一条旧地址,形如 /news/2018/0531.html,标题是“某片区临时停水通知”。新站已经没有这条通知,但有一个“通知公告”栏目页。此时不要直接跳到栏目首页了事,先问三个问题:这条内容现在还有参考价值吗?新站有没有语义等价的目标?跳过去之后用户能不能在两秒内确认自己找对了?
如果停水通知早已过期,最合理的是返回410,让搜索引擎知道这是永久移除,而不是把它跳到栏目页制造“所有旧新闻都指向同一处”的软404。反过来,如果旧地址是一篇“办理流程说明”,新站有更新后的同主题页面,就做301到那个具体页面,而不是栏目页。这一步的实际动作是:在映射表里为每条旧地址补一列“判断类别”,结果会直接决定后面是写跳转规则还是写移除规则。
一张可执行的映射表,至少包含旧路径、目标路径、状态码、判断依据、处理人五列。判断依据这一列最容易被省掉,但它恰恰是规模化后排查例外的依据。举例来说:
/about/contact.html → 新路径 /contact/,301,依据“联系方式页一一对应”。/news/2018/0531.html → 无目标,410,依据“时效性通知已失效”。/product/a.html 与 /product/b.html → 新路径 /product/,301,依据“两条旧产品合并为一条产品线”。注意第三行的取舍:把多个旧地址指向同一个新页,只有在内容确实合并时才成立。如果只是图省事,用户从不同旧地址进来都落到同一个泛页面,跳出会明显变高,而且你无法从日志里判断到底是哪条旧内容还在被需要。
小样本阶段常见的做法是:人工看几十条旧地址,凭感觉配新页,效果看起来没问题。但一旦旧地址上万条,例外就会集中出现。典型例外有三类:旧地址带参数或分页、旧地址本身是重复内容、旧地址指向的栏目在新站被拆成多个子栏目。
带参数的旧地址,例如 /list.php?cat=3&page=2,不能简单按字符串相等去匹配,否则同一栏目会散出大量映射行。更稳的处理是先归一到栏目层,再决定跳栏目页还是保留分页语义。重复内容则要先判断哪一条是规范版本,其余做301到规范版本,避免把多个旧地址都指向同一个新页却互相冲突。栏目被拆分的情况,需要按旧地址的实际主题逐条判断,而不是整批跳到新栏目首页。
这里有一个可验证的动作:抽100条旧地址,按上面的分类人工标注,再和新站实际存在的页面比对。如果发现超过两成的旧地址找不到语义等价目标,说明映射策略要从“尽量跳转”转向“允许410和栏目兜底”,下一步就该调整规则模板,而不是继续硬配。
映射规则上线后,不要只看“有没有报错”。更有用的证据是:旧地址的访问日志里,301 的落点分布是否集中、410 的请求是否在下降、栏目兜底页的停留是否异常短。如果大量旧地址都跳到同一个栏目页,且该页跳出很高,通常说明兜底过粗,需要把其中一部分拆回具体页面或改为410。
还要注意一个反常现象:某些旧地址请求量归零,并不一定证明处理正确。它也可能是旧地址早已不被外部链接引用,或抓取工具暂时没有回访。把请求量归零单独当作正确性证据是不成立的,必须结合映射表里的判断依据和实际落点一起看。
规模化之后,真正省力的做法是把已经确认的例外类型写成规则。例如:带 ?page= 的旧地址统一归一到栏目页;标题含“通知”“公告”且发布日期超过一定时长的,统一返回410;旧产品页若在新站找不到同主题页面,则跳到产品总览并记录待补内容清单。规则一旦确定,后续新增旧地址就能批量套用,人工只需要复核命中规则边缘的那部分。
最后回到你手里的那张映射表:先挑一条最典型的旧地址,按“内容是否成立—有无等价新页—落点是否可确认”走一遍,把它写成带判断依据的一行。这一行会成为整批处理的模板,也会决定你后面是继续扩表,还是先回头补新站缺失的页面。