站点做上几年,URL 总会变。换域名、上 HTTPS、栏目改名、统一去掉末尾斜杠,每一次调整都可能留下一条 301。单独一条重定向不是问题,问题在于它们会串起来:A 跳到 B,B 跳到 C,C 才是真正的内容页。蜘蛛要拿到这份内容,得先把这几跳走完。
一次跳转,蜘蛛实际做了什么
对蜘蛛来说,跳转不是免费的。每遇到一个 301 或 302,它都要单独发起一次请求,拿到响应头里的 Location,再对新地址发起下一次请求。也就是说,一条三跳的链,蜘蛛要发三次请求,才摸到第一段 HTML。
- 每一跳都占用一次抓取配额,链条越长,单位时间内能抓的页面越少;
- 每一跳都增加一次超时和出错的机会,中间任何一环抖动,整条路径就断在这里;
- 跳转目标如果是跨域或跨协议,蜘蛛还要重新判断这份内容归谁所有。
内容本身没问题,但发现它的成本被人为抬高了。站点规模小的时候感觉不出来,URL 到几万、几十万量级时,这些多出来的请求会实实在在占掉一批抓取额度。
链是怎么越接越长的
几乎没有站点会主动设计一条五跳的重定向。链是在一次次改版里被动接上的。
常见成因
- 逐级替换域名:先 http 换 https,再旧域名换新域名,两次操作各留一条规则,就叠成了两跳;
- 栏目分批改名:老栏目跳到过渡名,过渡名又跳到现在的名字,中间那一段没人清理;
- URL 规范化没做全:带斜杠的跳到不带的,带大写字母的跳到小写的,大小写和斜杠各自一条规则,互相叠加;
- 内容合并后没回头改:几篇旧文章合并成一篇,旧地址逐条跳过去,后来那篇又被合并了一次,链就长了。
多跳带来的实际损失
- URL 发现变慢:新页面本来可以一跳到位,现在要先经过几层中转,进入待抓队列的时间被推后;
- 抓取配额被稀释:同样的额度,一部分花在跳转上,真正抓内容的次数就少了;
- 链路脆弱:三跳里任意一环返回 5xx 或超时,蜘蛛这次就白跑一趟,下次未必马上回来重试。
把链压回一跳的做法
- 直接指向终点:旧地址的 301 目标写成最终 URL,不要写成中间那一版;
- 站内链接用最终地址:导航、面包屑、正文内链、相关推荐里如果还留着旧的跳转地址,蜘蛛每次都要多走一步,直接改成最终地址最省事;
- Sitemap 只放最终 URL:Sitemap 里混入会跳转的地址,等于主动给蜘蛛派了一堆中转任务;
- 不要串跳:发现 A 跳到 B、B 又跳到 C,就把 A 的规则改成直接到 C,而不是继续往后接;
- 少用链式跳转做临时活动:短期活动的 302 链结束后记得撤掉,别让它沉淀成长期路径。
怎么排查现有的链
不需要复杂工具,抓一份站内链接清单,逐个请求看响应头就能看出来。重点看三类入口:旧栏目的目录级地址、历史文章的旧 URL、以及带参数或大小写变体的地址。
- 抽取站内被链接最多的那批 URL,看它们返回的是 200 还是 301/302;
- 对返回跳转的地址,手工跟一次响应头,记录跳了几次、终点是谁;
- 把跳了两次以上的地址单独列出来,逐条改成直达终点;
- 改完之后,回头检查站内链接和 Sitemap 有没有还在引用中间地址。
重定向本身是正常手段,问题只出在层数上。把每一段跳转都压成一跳,蜘蛛拿到内容的路径就短了,省下来的额度才能用在真正的新页面上。
这件事不需要一次做完,按入口的重要程度分批处理就好。优先收拾被内链引用最多的那批地址,收益最明显。