做站点运营的人有时会在日志里看到一件怪事:明明只有一个商品页或文章页,蜘蛛却用不同的地址反复来抓。这些地址指向的内容几乎一样,只是多了个尾斜杠、换了大小写,或者带上了跟踪参数。对蜘蛛来说,每一个地址都是一个独立的 URL,都要单独走一遍抓取路径、单独读一次响应。地址越多,真正需要抓的页面分到的时间就越少。
URL 变体通常从哪来
变体很少是蜘蛛凭空造出来的,多数是站点自己放出去的。常见的几类:
- 尾斜杠与默认文件:/about、/about/、/about/index.html 三条地址都能访问同一页。
- 大小写混用:/Product/A 和 /product/a 在服务器上被当成两个资源。
- 协议与主机名:http 与 https、带 www 与不带 www 同时可访问。
- 追踪参数:utm_source、fbclid、gclid、会话 ID 等,从外部渠道带进来后被页面里的链接继承。
- 筛选与排序:?color=red&sort=price,多个维度一组合就成倍增长。
- 分页写法不统一:?page=2 与 /p/2 两套并存。
- 功能副本:打印页、AMP 版、移动版、分享预览页各自有独立地址。
为什么值得花时间收敛
它本身不会直接让页面掉出索引,但会从几个方向慢慢消耗抓取路径的效率。抓取配额被同类地址摊薄,新内容等待被抓的时间变长;站内链接被拆到多个地址上,每一条能传递的信号都变弱;日志里同一内容的记录混在一起,真出问题时不容易看出来;如果重定向和 canonical 写得互相打架,蜘蛛还会在几个版本之间来回确认。
先排查,再动手
动手前最好把现状摸清楚,否则容易改出一个更乱的状态。
- 把服务器日志按规范化后的路径聚合,看同一篇内容到底有多少个 URL 被访问过、各自访问量多少。
- 抽查页面源码里的链接写法,导航、面包屑、正文内链、分享按钮都要看,问题往往出在自动生成的那部分。
- 检查页面上的 canonical 指向哪里,是指向自己,还是指向另一个同样能直接访问的地址。
- 看 sitemap 里提交的是规范地址,还是把各种变体也一并交了上去。
收敛的几条常规做法
- 选一套规则并长期坚持:比如统一不带尾斜杠、统一小写、统一 https 与某一主机名。规则一旦定了,前端、后端、CDN、内链都要对齐。
- 用 301 做合并:把非规范版本永久跳转到规范版本,让蜘蛛在第一次遇到时就知道该记哪一个。canonical 是提示信号,不能替代重定向。
- 统一内链写法:站内链接尽量直接用规范地址,减少蜘蛛需要跳一次才能到达目标的情况。像 rel=canonical 一样,链接写法也是给蜘蛛的明确指向。
- 谨慎使用 robots.txt 屏蔽:被屏蔽的 URL 不会再被读取,但站点上的链接仍然指向它,其他页面外链到它时也可能让它出现在结果里,此时 canonical 也传不出去。屏蔽参数前先想清楚它是重复内容还是有独立价值的页面。
- sitemap 只放规范 URL:把它当成一份愿望清单,交上去的应该都是你希望被抓的最终地址。
把抓取配额当成有限的资源来分配:同一份内容只留一个入口,其余的地址尽早合并掉,剩下的时间才轮得到新页面。
筛选组合页要区别对待
带参数的页面并不都是垃圾。颜色、尺寸、价格区间这类筛选,用户确实会用到,也有搜索价值。难点在于排列组合可能上万,蜘蛛顺着筛选链接一路点下去,很容易走进一片内容稀薄、彼此高度相似的页面里。
可以试的做法是:限制可选维度,只开放少数几个有实际搜索量的筛选;排序、视图方式这类参数固定默认值,不作为独立入口;多条件组合页用 noindex 加上 canonical 指向主分类页;分页保持单一写法,并且保证从第一页能顺着链接走到后面几页。
URL 变体不是清理一次就结束的事。新功能上线、活动页、渠道投放的追踪参数,都会不断把新地址塞进站内链接。比较省力的方式是把它变成一条常规检查:新页面发布前看一眼地址写法,新渠道上线前确认参数不会留在站内链接里。这样日志里的重复抓取会慢慢减少,蜘蛛在站内走的路径也会更集中。