同一个页面,在服务器上可能对应好几个地址。大小写不同、末尾有没有斜杠、参数顺序调换,这些都能让蜘蛛把它当成两条 URL。抓取次数被分散,入口信号也会拆散。下面讲怎么核对并收敛这些变体。
常见的 URL 变体类型
- 大小写差异:/About 与 /about 在某些服务器上指向同一文件,在另一些配置下会返回 404。
- 末尾斜杠:/page 与 /page/ 是否等价,取决于服务器配置和框架路由。
- 查询参数顺序:?a=1&b=2 与 ?b=2&a=1,多数程序返回相同内容,地址串却不同。
- 追踪参数:utm_source、from、ref 之类,会把同一内容拆成很多地址。
- 默认文档:/index.html 与 / 指向同一个页面。
- 协议与主机名:http 与 https、带 www 与不带 www。
变体为什么会让抓取变得零散
蜘蛛判断一个地址见没见过,主要靠 URL 字符串。字符串不同,就当成新地址排队。结果通常是:
- 同一份内容的抓取次数成倍上升,真正更新的页面反而排到后面。
- 内链指向不同变体,蜘蛛顺着链接走时,容易落到非规范的那一条。
- Sitemap、内链、外链各指向一个版本,入口信号不集中。
抓取日志里如果同一篇内容出现多条地址,先别急着判定是重复抓取,先确认这些地址是不是变体。
核对顺序
- 在抓取日志里按路径片段聚合,找出同一内容对应的多条地址。
- 检查站内链接实际写的是哪一条,尤其是导航、面包屑和列表页。
- 看 Sitemap 里放的是哪一条。
- 看页面 canonical 声明的又是哪一条。
这四处如果指向不同地址,说明变体的来源不止一处,需要逐项统一,而不是只改其中一处。
处理方式
能跳转的就跳转
确定主地址后,其余变体用 301 指过去。跳转链只保留一跳,不要 a 到 b、b 再到 c。主机名和协议层面的统一,一般放在服务器或 CDN 层处理更省事。
跳不了的用 canonical
参数类变体往往没法全部做跳转,尤其是带追踪参数的外链。这时可以在页面上声明 canonical,指向不带参数的规范地址。canonical 是提示而非强制,所以内链和 Sitemap 仍然要统一到规范地址,不能只靠它兜底。
内链和 Sitemap 只写规范地址
这是最容易被漏掉的一步。跳转和 canonical 都在补,源头如果一直生成变体链接,问题会反复出现。检查模板里拼接链接的位置,确认没有多余参数、没有大小写不一致。
不要过度归一
有些参数是有意义的,比如分页、筛选、语言版本,这些地址的内容确实不同,不能一律合并成一条。判断标准很简单:去掉参数后,页面主体内容是否一致。一致就归拢,不一致就保留,并按各自的方式管理抓取。
改完之后的观察
调整生效需要时间。可以在接下来的抓取日志里,按之前聚合出的变体路径再看一遍:变体地址的请求是否在减少,规范地址的请求是否稳定出现。如果变体还在被大量抓取,多半是某个入口仍在输出旧地址,回到内链和 Sitemap 再核对一遍即可。