站点改版、换域名、调整栏目结构,都会留下旧地址。为了让访问者和蜘蛛都能走到新页面,通常要配置重定向。但重定向不是配置完就结束,跳转链路的长短、状态码的选择、落点是否可抓取,都会直接影响蜘蛛能不能顺利完成这一轮抓取。
蜘蛛遇到 3xx 之后做了什么
当蜘蛛请求一个 URL 拿到 3xx 响应时,它不会立刻放弃,而是读取响应头里的 Location 目标地址,再发起一次新的请求。这次请求和第一次一样,要重新经过解析域名、建立连接、等待响应等环节。也就是说,跳转不是零成本的,它相当于让蜘蛛多抓了一个页面,只不过这个页面没有内容。
拿到最终页面的 200 响应之后,蜘蛛才开始解析正文和链接。如果同一批 URL 都带着跳转,抓取预算就会被大量消耗在中转环节,真正的内容页面反而抓得更少。
链式跳转:每一跳都要重新排队
比单次跳转更麻烦的是链式跳转。常见的情况是 http 跳到 https,https 的裸域再跳到 www,www 又跳到带语言目录的地址,一条链走完要三到四次。对这种地址,蜘蛛通常不会无限跟下去,跳转次数过多时可能中途停止,最终页面就进不了抓取范围。
即便蜘蛛一路跟到底,中间每一跳的地址也会被记录,日志里出现大量 301,看上去抓取很活跃,实际覆盖到的独立页面并不多。
301 和 302 不能用混
301 表示永久迁移,蜘蛛会逐步把旧地址替换成新地址,把已经积累的信号转移到目标页。302、307 表示临时跳转,蜘蛛通常保留旧地址继续观察,不做替换。如果长期用 302 承担永久迁移的职责,旧地址会一直留在抓取队列里,新地址也得不到稳定确认。
还要留意 302 的落点。有的站点把无结果页跳到列表页,或者把需要登录的地址跳到首页,这类跳转一旦被大量内链指向,蜘蛛就会反复跟到同一个页面,形成无效抓取。
几种容易把蜘蛛带偏的跳转
- 循环跳转:A 跳到 B,B 又跳回 A。蜘蛛跟几次后会放弃,两个地址都难以被正常处理。
- 超长链条:转手四五次以上,中途被放弃的概率明显上升。
- 跳到不可抓取的地址:跳转目标被 robots.txt 拦截,或本身返回 404、410,等于白走一趟。
- 跨协议跨域叠加:http 到 https、裸域到 www、主域到子域同时存在,链路被越拉越长。
- 落点频繁变化:目标地址不稳定,蜘蛛每次跟到的结果都不一样,很难判断哪个是正式地址。
内链和 Sitemap 该指向哪一版
做重定向的同时,站内剩下的链接要同步更新。理想状态是站内链接直接指向最终地址,让蜘蛛一步到位;重定向只留给外部链接、历史收藏和已经进入索引的旧地址。如果内链还大量指向跳转地址,等于人为把抓取路径拉长。
Sitemap 里同样只放最终地址。把跳转地址写进 Sitemap,会让抓取队列里混入一批永远返回 3xx 的 URL,白白占用额度。同时要确认 Sitemap、内链、canonical 指向的是同一个版本,避免给出互相矛盾的信号。
自查重定向链的顺序
- 从日志里筛出状态码为 3xx 的请求,按 URL 汇总,看哪些地址被反复抓取。
- 对这些地址用命令行工具或抓取工具完整跟一遍,记录跳转次数和最终状态码。
- 重点检查落点:是否返回 200、是否被 robots.txt 允许、是否是伪装成正常页面的软 404。
- 检查内链和 Sitemap,把指向跳转地址的链接替换成最终地址。
- 确认状态码选择正确:永久迁移用 301,真正临时的场景才保留 302。
重定向是过渡手段,不是长期方案。链路越短、落点越稳定,蜘蛛把时间花在内容上的比例就越高。