常见问题

入口页链接经过 301 跳转,搜索蜘蛛会把哪个 URL 当成目标

入口页里的目标链接如果先经过 301 或 302 跳转,搜索蜘蛛发现和抓取的往往不是 href 里写的那个地址。本文拆开发现、抓取、归属三个环节,说明跳转链过长、跨域跳转、参数丢失时常见的 URL 混乱,并给出整理入口页链接的排查顺序。

常见问题

入口页链接经过 301 跳转,搜索蜘蛛会把哪个 URL 当成目标

发现和抓取不是同一个动作

搜索蜘蛛从入口页解析出 a 标签的 href 后,第一件事是把链接放进待抓取队列,这时候记下的通常就是 href 里写的地址。只有真正发起请求之后,它才会遇到跳转,并根据响应头里的 Location 继续往下走。所以“入口页写了什么”和“最终抓到了什么”,在日志里经常是两条不同的记录。

如果最终地址返回的是 200,搜索蜘蛛一般会把内容和 URL 归属到这一跳的地址上,而不是入口页里最初写的那个。这也是很多站点在日志里看到旧地址有请求、新地址却没有稳定抓取记录的原因之一。

301 和 302 的处理差别

301 表示永久跳转,搜索蜘蛛通常会把原地址的信号逐步转移到新地址,后续也更可能直接抓取新地址。302 是临时跳转,处理上更保守,原地址仍然会保留在队列里,被反复请求的概率更高。

对入口页来说,这意味着同一个目标页,用 301 指向和用 302 指向,长期表现可能完全不同。如果你在入口页里给目标 URL 挂了一层 302,又同时用别的方式提交了最终地址,两个地址都会出现在抓取队列里,白白占掉一部分请求额度。

跳转链太长会带来什么

  • 每一跳都要额外发一次请求,抓取预算被一层层摊薄;
  • 中间任意一环超时、返回 5xx,整条链就断在那里;
  • 跳转层级太深时,最终页面可能只被部分抓取;
  • 带参数的跳转容易在某一跳丢掉 utm、分页或路径后缀;
  • 链路里如果有移动端适配或区域判断,还可能跳到另一个版本的 URL。

跨域跳转要注意的细节

入口页在 A 域、最终页在 B 域,搜索蜘蛛照样会跟进,但归属会落到 B 域的地址上。用 301 时,A 域入口页积累的信号会向 B 域传递;用 JS 跳转或 meta refresh,处理方式又不一样。这里的关键不是“能不能跟”,而是你要提前想清楚希望哪个域名、哪条路径被记住。

几种常见的 URL 混乱场景

  1. 入口页 href 写的是旧域名,跳转后落到新域名,日志里新旧地址都出现请求;
  2. 跳转地址里带 session id 或随机参数,每次抓到的最终 URL 都不一样;
  3. 同一目标在入口页里既写了直连链接,又写了一条跳转链接,队列中出现两条记录;
  4. 跳转落点是需要登录或受地区限制的页面,蜘蛛抓到的是拦截页而不是正文;
  5. 跳转目标是带尾斜杠和不带尾斜杠的两个版本,被当成两个地址处理。

一套可执行的排查顺序

  • 先用 curl -I 看入口页 href 那一跳返回的是 200 还是 3xx;
  • 顺着 Location 一直跟到最后一跳,确认最终状态码和最终 URL;
  • 把服务器日志里蜘蛛请求的地址,和手动跟出来的最终地址逐条对照;
  • 重点检查参数是否丢失、域名大小写、路径尾斜杠、http 与 https 的差异;
  • 在表格里把“发现地址”和“最终抓取地址”分成两列,不要混记成一条。

整理入口页链接时的几个习惯

能直连就不要绕跳转,尤其是入口页这种主要承担发现任务的位置。确实需要跳转时,把层级控制在 1 跳以内;跨域跳转尽量用 301,并保持路径结构可预测;不要在跳转过程中附加随机参数或临时追踪码;入口页链接定期过一遍,避免长期指向已经下线的旧地址。

跳转本身不会阻止 URL 被发现,但它会改变最终被记录下来的那个地址。与其纠结搜索蜘蛛跟不跟,不如先把入口页里每条链接的落点确认清楚。