做 URL 迁移、合并多个域名、处理历史遗留地址时,跳转是最常用的手段。但跳转不只是一个把用户送到新地址的技术细节,它同时也在向搜索引擎说明这两个 URL 之间是什么关系。同样是从 A 跳到 B,用 301、302、meta refresh 还是 JS,最终索引里留下哪个地址,结果可能不一样。
先分清两类跳转语义
可以把跳转分成两派:永久性跳转和临时性跳转。
- 永久性:301、308。表示旧地址以后不再使用,权重和索引信号会向新地址转移。
- 临时性:302、307。表示这只是暂时状态,旧地址理论上还会恢复。
搜索引擎对永久跳转的处理更彻底,会尝试把旧 URL 从索引里替换成新 URL。临时跳转则倾向于保留旧 URL 的索引状态,同时去抓取新地址。所以迁移页面时如果用了 302,可能出现旧地址还在被搜到、新地址迟迟不进来的情况;而且每次访问都要多一跳,抓取效率也更差。
meta refresh 和 JS 跳转
这两种方式不是 HTTP 层的响应,而是页面内容里的指令。
meta refresh 写在 HTML 头部,浏览器能识别,主流搜索引擎也会处理一部分,但它的信号明确程度不如 301。尤其是有延时的写法,比如让页面停留几秒再跳转,用户会看到一段空白或停留状态,爬虫也可能把它当成普通页面内容,而不是跳转指令。零秒刷新的行为接近 301,但语义表达依然偏弱。
JS 跳转需要执行脚本才会发生。搜索引擎渲染页面后可能跟随,但存在两个风险:一是渲染本身有排队和超时,跳转未必每次都被执行到;二是如果页面没有其他可抓取内容,这个 URL 在爬虫眼里可能就是一个空壳。用 JS 做跳转,等于把能否被正确发现这件事交给了渲染环节。
跳转链和循环是更常见的问题
比单次跳转更容易被忽略的是链条:A 跳 B,B 跳 C,C 跳 D。每多一跳,信号都可能被消耗,而且爬虫需要串行访问多个地址,抓取成本成倍增加。更麻烦的是循环,比如 A 跳 B、B 又跳回 A,或者经过几跳后落在一个 noindex 页面上,最终目标既不可索引,也浪费了抓取机会。
常见诱因包括:CDN 和源站各配了一条跳转规则、HTTP 到 HTTPS 与 www 到非 www 叠加、多条 URL 规范化规则互相覆盖。排查时应该以最终落地 URL 为准,而不是只看第一次响应。
自查时看这几件事
- 用抓包工具或重定向检查工具,看完整链路共有几跳,最后一跳落在哪个 URL。
- 确认最终 URL 返回 200,且没有被 robots.txt 屏蔽、没有 noindex。
- 迁移场景优先使用 301 或 308,而不是 302 或 JS。
- 跳转目标尽量是内容对应的页面,不要把所有旧地址统一送到首页。
- 内链、站点地图、canonical 都指向最终 URL,减少旧地址被反复发现的机会。
跳转是一种声明,不是命令。搜索引擎会根据它调整对 URL 关系的判断,但最终决定收录的,仍然是目标页面能不能被正常抓取、有没有值得索引的内容。把跳转配干净,只是把门口的障碍清掉。