蜘蛛是按 URL 记账的。同一个页面只要能通过两个不同的地址访问,它在抓取队列里就会占两个位置,日志里出现两行记录,权重也被摊成两份。很多时候抓取量看着不少,真正需要的页面却没被覆盖,问题就出在这种地址分叉上。
常见的地址分叉有哪些
大多数分叉不是有人故意造出来的,而是服务器配置、模板写法和编辑习惯叠加的结果。常见的有:
- 协议与主机名:http 与 https、带 www 与不带 www 同时可访问,组合起来就是多个地址。
- 末尾斜杠:/list 与 /list/ 返回同一份内容。
- 大小写:/About 与 /about 都能打开,部分服务器和 CMS 并不区分。
- 默认文件名:/index.html、/index.php 与目录根地址并存。
- 参数顺序:?a=1&b=2 与 ?b=2&a=1 指向同一结果。
- 锚点:普通 #section 不会产生新 URL,但 #! 形式或前端 hash 路由会被当成独立入口。
为什么要当成问题处理
抓取配额有限,地址越多,每个地址分到的回访越少。更麻烦的是信号分散:外链指向的地址不统一,内链写法前后不一致,蜘蛛需要反复判断哪些其实是同一页。日志也会变得难读,你可能以为某个栏目只有两百个 URL,实际统计出来上千条。
如果内容本身比较单薄,重复入口还会让去重逻辑更容易误判,站内搜索结果里也可能出现两条几乎一样的记录。
收敛的做法
先定一个规范地址
给每个页面确定唯一的书写形式:一种协议、一种主机名、末尾斜杠按目录统一、路径统一小写。把它写进团队文档,比自己记住更可靠。
用 301 而不是只靠 canonical
canonical 是提示,不是指令,蜘蛛仍可能去抓那个变体。能通过服务器或 CMS 做 301 的,就优先 301 到规范地址;canonical 留给那些技术上不好跳转的变体,比如带追踪参数的分享链接。
内链和 Sitemap 只写规范地址
导航、面包屑、正文链接、分页链接以及 Sitemap 里的 loc,统一使用规范写法。只要其中一处随手写成大写或漏了斜杠,就等于又给蜘蛛开了一个入口。
把参数和锚点管起来
参数顺序能固定的就固定;追踪参数用规则在服务器端剥离或 301;前端 hash 路由如果不是业务必须,尽量不要承担主要内容入口的角色。
验证有没有收敛干净
- 在服务端访问日志里按主机名、协议、路径大小写分组,看还有哪些变体在被抓。
- 抽查主要外链,看它们指向的是规范地址还是变体。
- 用几种写法分别请求,确认返回的是 301 而不是 200。
- 观察一到两周的抓取日志,看规范地址的占比是否上升。
容易回退的地方
收敛之后最容易回退的几个点:CMS 升级后默认路径规则变了、新模板生成链接时忘了统一斜杠、编辑复制分享链接时带上了追踪参数、Sitemap 生成插件换了规则。建议把规范写法放在模板层,用一个统一生成链接的函数或配置项来兜底,而不是靠每篇文章手动注意。
地址收敛不会让抓取量立刻翻倍,但它能让同样的抓取次数落在真正需要的页面上,这通常比想办法催蜘蛛更有效。