站点调整 URL 结构、合并栏目或更换域名时,一般都会给老地址做 301。做完之后常常会遇到一件事:索引里老地址仍然存在,有的还继续出现在搜索结果里。这时候容易有两种反应,一是反复提交新地址,二是干脆把老地址的跳转删掉。两者都不太稳妥。更值得做的,是按跳转类型、跳转执行情况、索引现状、内链与入口这几条线依次核对。
先确认跳的是哪一种
同样是“跳转”,浏览器里的观感差不多,但搜索端收到的信号差别很大:
- 301 永久跳转:最常见的迁移信号,用于结构永久调整。
- 302、307 临时跳转:本来用于临时场景。如果长期挂着,搜索端可能继续保留老地址,甚至反复抓取老地址。
- meta refresh 与 JS 跳转:服务端返回的仍是 200,只是页面里写着跳转。这种地址本身会被当成正常页面处理。
- 跳转链:A 跳到 B,B 又跳到 C。链条越长,抓取端越容易中途停下。
把这几种和自己的实际情况对一遍,很多“看起来没生效”的问题,其实是类型用错了,或者压根没走服务端跳转。
检查跳转是否真的发生在服务端
用不带 JS、不带 Cookie 的方式直接请求老地址,看返回的状态码和响应头。核对要点大致是:
- 状态码是不是 301 或 308,而不是先返回 200 再靠前端跳。
- Location 指向的是不是最终地址,而不是链条中的下一跳。
- 最终地址本身是不是 200。有些链条最后落在一个 404 或空页面上。
- 跳转是否对搜索端和普通访客返回一致。有些站点会按 UA 区分,这容易造成两边看到的不是同一个东西。
如果老地址返回 200,只是页面里在跳,那它在搜索端就是一个独立页面,被收录是正常结果,不能算“没生效”。这类页面要么改成服务端跳转,要么按普通页面决定留还是收。
索引里老地址还在,先别急着下判断
做了跳转不等于索引立刻更新。老地址在一段时间内继续出现在索引和搜索结果里,本身是可以理解的。真正需要区分的是下面三种情况:
- 老地址被收录,但点开跳到了新地址。这类通常会逐步被替换。
- 老地址被收录,点开仍是老内容。说明服务端跳转没生效,或者中间存在缓存。
- 新地址还没被收录,老地址仍在顶替展示。这时重点不在老地址,而在新地址本身。
对第二种,先回到上一步检查响应;对第三种,重点是把新地址的入口、导航和内容理顺,而不是反复去动老地址。
内链、外链和 sitemap 里还指向老地址
跳转只是兜底,不是入口。真正影响抓取优先级的,是站内还往哪里指。常见的遗漏有:
- 导航、面包屑、侧栏里仍写着老地址。
- 正文里的历史内链没有同步更新。
- sitemap 里同时列着老地址和新地址。
- 老地址的 canonical 指向自己,或者干脆没写,而新地址的 canonical 又反过来指向老地址。
这几处对齐之后,搜索端收到的信号才是“大家都指向新地址”。canonical 写反是很常见的一处,值得单独看一眼。另外,老地址如果还有外链进来,不必急着彻底断开,保留一个轻量的 301 通常比直接 404 更平稳。
什么时候可以考虑停掉跳转
并没有统一的时间表。可以先看两个信号:老地址在服务端日志里的请求量是否已经降到很低,以及搜索结果里是否基本被新地址替代。即便到了这一步,保留一个 301 的成本通常也很低,除非有明确的业务原因必须删除。
把跳转当成过渡手段,把入口和内容当成长期手段。前者处理历史,后者决定新地址能不能被稳定发现。
整体顺序可以记成:先看跳转类型,再看服务端响应,然后按索引现状分类,最后回到内链与 sitemap 收口。每一步只解决一个问题,避免一上来就删跳转、改 canonical 或者反复提交。