跳转不是一次请求,而是一串请求
很多站点把 301 当成顺手处理的事情:http 跳 https、带 www 跳不带 www、旧目录跳到新目录、末尾斜杠再补一刀。对用户来说,浏览器地址栏一闪就过去了;对蜘蛛来说,每一次跳转都是一个独立的 HTTP 请求。蜘蛛需要先拿到 3xx 响应和 Location 头,再对新的地址发起一次请求,逐跳推进,直到拿到 200 才真正开始解析页面内容。
换句话说,一个要跳三次才能到达的地址,实际消耗的抓取次数是四次:三次 3xx 加一次 200,而不是一次。站点规模上来之后,这种放大效应会变得很可观。
多跳链路通常从哪里来
- 协议与主机名叠加:http://example.com 先跳到 https://example.com,再跳到 https://www.example.com,最后才落到具体页面。
- 结尾斜杠与大小写:服务器配置把 /a 跳到 /a/,把 /A 跳到 /a,链路上又多出两环。
- 迁移残留:老域名、老目录、老参数地址没有一次性指向最终地址,而是先指到一个中间页。
- 边缘层规则叠加:CDN 或反向代理先跳一次,请求回到源站后又跳一次。
- 按 UA 或语言分支跳转:根据 User-Agent、Accept-Language 决定跳向哪个版本,蜘蛛和用户可能走到不同终点。
- 短链与营销链接:为了统计点击,中间再套一层跳转页。
跳转链对抓取路径的三点影响
第一,请求数被放大。每多一跳,就多占一次抓取额度,而这些请求本身并不产出任何可索引的内容。
第二,发现变慢。蜘蛛沿着内链或 Sitemap 找到一个地址后,如果它是一条长链,那么真正落地页被确认的时间会被推后,新内容的更新信号也可能因此延迟被感知。
第三,分支不一致容易制造重复地址。同一个页面因为跳转条件不同,可能产生 HTTP 版、HTTPS 版、带 www 版等多个中间态,蜘蛛需要额外去判断哪一个是规范地址。
怎么把链路看清楚
单条地址的检查
用命令行工具跟踪完整链路,逐条记录状态码和 Location 指向,重点关注跳转次数超过一次、以及中途出现循环或多终点的情况。关键页面、频道入口页、Sitemap 中出现的地址,都可以抽样跑一遍。
批量观察
在服务器日志里筛选 3xx 状态码,按 Location 的目标地址聚合,看哪些目标被反复跳转、哪些链路的层级最深。比起盯单个 URL,日志聚合更容易发现成片的配置问题,比如某条边缘规则影响了整个栏目。
收口的几个做法
- 让每条链只跳一次,直接指向最终地址,不要中途经过过渡页。
- 全站统一协议与主机名,站内链接、Sitemap、RSS 里直接写最终形式。
- 检查 CDN、WAF、反向代理层的跳转规则,避免与源站规则叠加成两跳。
- 迁移时把旧地址一次性映射到最终地址,而不是先跳到中间页再跳一次。
- 尽量不给蜘蛛单独设置跳转分支,让它和用户落到同一个最终地址。
- 定期复查内链与 Sitemap 中的地址,确认返回的是最终态的 200,而不是 3xx。
收口的目标很朴素:把每个 URL 的到达成本压到最低。链路短了,同样的抓取额度就能覆盖更多页面,蜘蛛在站点里的推进也会更顺。
跳转本身不是问题,问题是同一批地址每次都要多走几步才到终点。