站点做了 canonical,日志里还是能看到带参数的地址、大写地址、旧域名被反复抓取。这通常不是蜘蛛没看懂标签,而是抓取和索引本来就不是同一件事:只要一个 URL 被链接、被 Sitemap 列出、被历史记录记住,它就有机会进入抓取队列,canonical 一般在这一步之后才起作用。
重复 URL 一般从哪几个口子冒出来
先把来源分清楚,比一上来就加标签更有效。
- 参数:排序、筛选、追踪用的 utm、会话 ID、分页参数。
- 同一地址的不同写法:大小写、结尾斜杠、默认端口、www 与非 www。
- 内容副本:打印页、移动版、AMP、旧域名、http 与 https。
- 程序生成:站内搜索结果页、标签聚合页、日历页。
这些 URL 有的是被内链带出来的,有的是外链残留,有的干脆来自 Sitemap 自己写错。
canonical 管的是合并,不是拦截
canonical 告诉蜘蛛“这一组里以哪个为准”,但它不阻止抓取。蜘蛛发现 URL、抓取、渲染,再判断是否需要合并,顺序上抓取在前。也就是说:重复 URL 被大量抓取时,真正被消耗的是抓取预算和服务器资源,canonical 只能减少后续的索引混乱,减不掉前面的请求数。
另一个容易忽略的点是:被抓不等于被索引,但“未被索引的抓取”依然占用带宽、CPU 和蜘蛛的时间片。对中小站点来说,这部分浪费往往比想象中大。
收口要从“少被发现”开始
减少重复 URL 被抓,重点是管住它们的发现路径,而不是事后贴标签。
- 内链统一指向规范版本:导航、面包屑、列表页、正文链接都指向同一种写法。
- Sitemap 只放规范 URL:Sitemap 是主动提交入口,写错等于邀请蜘蛛来抓重复地址。
- 能 301 的就 301:真正的旧地址、多域名、http 到 https,用跳转比 canonical 更直接。
- robots.txt 留给无价值参数:如站内搜索、会话参数。注意被屏蔽的页面无法再通过 canonical 传递信号,只适合确实不需要参与索引的地址。
- hreflang 与 canonical 保持一致:多语言站点里两个标注指向不同 URL,最容易让蜘蛛来回抓。
有一种情况值得单独提:站内搜索页和带排序参数的列表页。它们内容随查询变化,蜘蛛很容易顺着一个输入框或一个排序链接进入数量近乎无限的 URL。这类地址除了在 robots.txt 里屏蔽参数目录,页面上的入口也尽量改成表单提交或按钮,而不是可爬取的 a 标签。
怎么确认收口有没有生效
看三处:服务器日志里重复地址的抓取次数是否下降;Search Console 的“重复网页,用户未选定规范网页”是否减少;“已发现 - 尚未编入索引”的数量是否回落。判断周期要给够,改完内链和 Sitemap 后,蜘蛛重新走一遍通常需要数周时间。
一个常见的执行顺序
- 从日志里列出被抓次数最多的前几十个 URL,去掉参数看真实路径。
- 逐个判断:保留、合并,还是彻底不要。
- 合并的做 301,不要的用 robots.txt 挡,保留的写进 Sitemap。
- 全站内链换成规范写法,包括页脚和侧栏里那些长期被忽略的链接。
- 过一段时间再比对日志,确认抓取集中到了有价值的页面上。
canonical 解决“哪一个是正本”,301 和 robots.txt 解决“会不会被请求”。把这两件事分开做,重复 URL 的抓取量才会真正降下来。