很多站点在日志里会出现这样的情况:同一个页面,被搜索蜘蛛用三四种不同的地址反复抓取。内容只有一份,抓取次数却被摊薄成几份。问题往往不在内容本身,而在于入口没有收敛。
同一页面常见的几种写法差异
URL 发现靠的是链接、Sitemap、跳转等多条通道,只要有任意一条通道给出另一种写法,就会多出一个待抓地址。
- 协议不同:http 与 https 各有一套地址,旧链接和模板里写死的 http 地址,都会把蜘蛛引到另一个入口。
- 主机前缀不同:带 www 与不带 www、主域名与备用域名,如果都返回 200,等于两份彼此独立的站点。
- 尾部斜杠不同:/page 与 /page/ 被服务器同时接受时,两条地址都会被记录。
- 大小写与默认端口:/About 与 /about、带 :80 或 :443 的绝对地址,都会形成新的入口。
- 参数顺序与追踪参数:?a=1&b=2 与 ?b=2&a=1,再加上来源标记,可以衍生出大量变体。
重复入口带来的实际影响
最直接的表现是抓取次数被分散。原本可以集中在主地址上的回访,被切给了几个副本;副本内容一致,更新时又不会同步变化,蜘蛛反复比对之后仍然拿不到新信息。
其次是信号被拆散。外链、内链、点击数据分别指向不同写法时,单一地址收到的指向就变少,页面在站点结构里的位置也变得模糊。对以 URL 发现为核心的抓取流程来说,这相当于人为拉长了队列。
判断标准很简单:如果同一份内容在日志里长期以多个地址出现,并且各自都有稳定抓取量,就说明规范化还没做完。
收敛入口的三层做法
服务器与跳转层
选定唯一主地址,其余写法统一做 301 跳转到它,而不是用 200 并列返回。协议、www 前缀、尾斜杠、大小写这类差异,最适合在这一层解决,一次处理对所有入口生效。
页面与内链层
站内链接、导航、面包屑、Sitemap 里的地址要与主地址完全一致。常见疏漏是模板里写死旧地址,或者编辑手工复制了带参数的链接。前者改模板,后者靠发布前检查。
声明与提交层
canonical 指向主地址,Sitemap 只收录主地址。不建议在 Sitemap 里同时列出主地址和副本,那等于主动为两个入口各做一次 URL 发现。
一份可执行的自查顺序
- 从日志里筛出抓取次数靠前、但地址写法不统一的页面。
- 逐个访问这些写法,确认返回码是 200 还是 301。
- 检查模板与正文区,找出写死旧地址的位置。
- 核对 Sitemap 与 canonical,确认两者与主地址一致。
- 修改后观察一段时间内的抓取地址分布是否收敛。
规范化不是一次性的工作。改版、更换证书、调整目录结构时,都容易重新产生副本入口。把这些检查放进发布流程,比事后从日志里翻要省力得多。