蜘蛛抓取一个 URL 时,如果服务器返回 301 或 302,它会顺着 Location 继续请求下一个地址。这个过程对用户几乎无感,对蜘蛛却意味着多一次往返。单次跳转通常可以接受,但当成串的重定向出现时,抓取效率会明显被消耗。
重定向本身不是错,错在链太长
网站迁移、协议切换、域名统一,都离不开重定向。问题不在于“有没有跳转”,而在于“要跳几次”。蜘蛛每跟一次跳转,就要重新建立请求、等待响应,日志里也会多出一条记录。如果内链和 Sitemap 里写的还是旧地址,蜘蛛每次访问都要走完整条链,长期下来就是持续浪费。
一次重定向,蜘蛛要付出什么
- 多一次 HTTP 请求的等待时间,尤其在响应较慢时叠加明显;
- 抓取队列里的 URL 状态会变化,旧地址可能被反复抓取;
- 跳转链中间环节如果返回错误,蜘蛛可能直接放弃;
- 带参数的跳转还可能被当成新 URL,增加重复抓取。
301、302、307、308 在抓取中的差别
301 表示永久移动,蜘蛛通常会逐步把索引指向新地址,旧地址的抓取频次会下降。302 表示临时移动,蜘蛛可能继续抓旧地址,因为它不确定跳转是否长期有效。307 和 308 会保持原请求方法,主要用于非 GET 场景,普通页面里不多见。选择哪种状态码,要和实际的迁移意图一致,不要长期用 302 替代 301。
链式重定向常见的几种来源
- http 跳 https,同时 www 又跳非 www,叠成两跳;
- 末尾斜杠规则不统一,/page 跳 /page/,再跳一次到最终地址;
- 旧域名整体迁移后,内链没有同步更新;
- CMS 插件、CDN、负载均衡各自加了一条跳转规则;
- 移动端适配或语言切换时,用跳转代替直接输出正确页面。
怎么排查重定向链
- 用命令行工具逐层查看响应头里的 Location,确认到底跳了几次;
- 在浏览器开发者工具的 Network 面板里看请求链路;
- 翻服务器日志,找同一个 URL 出现多条 301/302 记录的情况;
- 检查 Sitemap 和主要内链,确认写的是最终地址而不是中间地址;
- 确认跳转终点返回 200,而不是又一个跳转或错误页。
把重定向控制在合理范围
多数情况下,一跳到位是可以做到的。把 http 到 https、www 到非 www、末尾斜杠这些规则合并成一次跳转,内链和 Sitemap 直接使用最终 URL,旧地址只保留必要的 301。不要让重定向链形成循环,也不要用重定向去掩盖本该返回 404 的页面。
重定向是桥,不是路。桥太多,蜘蛛也会绕累。
抓取效率是一点点积累出来的。减少每一跳的等待,把入口直接指向最终地址,蜘蛛才能把时间花在真正的内容页上。