很多站点在做收录检查时会遇到一种情况:某个页面的内容只有一份,但索引里、日志里、后台统计里却出现了好几个地址。它们指向同一个模板、同一段正文,只是 URL 长得不太一样。这不是抽象的“内容重复”问题,而是很具体的 URL 变体问题。先把它排查清楚,再谈收敛。
常见的 URL 变体从哪里来
- 大小写:/Product/ABC 与 /product/abc 在某些服务器配置下都能返回 200。
- 末尾斜杠:/list 与 /list/ 被当成两个地址。
- 默认文件名:/about 与 /about/index.html 同时可访问。
- 协议与域名:http 与 https、带 www 与不带 www,几套组合各自能打开。
- 参数:追踪参数、排序筛选、分页、会话 ID 都会生成新字符串。
- 编码差异:中文或空格被不同方式编码,拼接出不同 URL。
这些变体单独看都不算错,但当它们同时可访问、又都能被抓到时,问题就出来了:抓取被摊薄,权重信号被分散,日志和后台统计里同一页面被算成好几页,判断问题的基础数据本身就失真了。
先统一统计口径,再判断问题。否则你看到的“页面数”本身就是被放大的。
第一步:把候选 URL 归一化分组
从服务器日志、站点地图、站内链接、搜索结果里各取一批 URL,用一套简单规则做归一:去掉参数、统一小写、去掉末尾斜杠、去掉默认文件名、统一协议与域名。归一后相同的算一组,看哪些组里有多个成员。
这一步的价值在于把“感觉有重复”变成“具体是哪几组有问题”,后续处理才有明确目标。
第二步:逐个变体看它现在的状态
- 返回码是什么,200、301 还是 404。
- 页面里有没有 canonical,指向哪个地址。
- 内链和站点地图里用的是哪个版本。
- 这个变体是否被抓过,抓取频次如何。
常见的麻烦是信号互相打架:A 变体的 canonical 指向 B,B 又指向自己;或者内链指向 A,而站点地图写的是 B。这种情况下蜘蛛只能自己猜,不同时间猜的结果还可能不一样。
第三步:定一个规范版本,其余收敛过去
规范版本通常选:全小写、不带默认文件名、统一使用一个协议和域名版本、不带追踪参数。然后按下面几件事处理:
- 能在服务器层做 301 的就做 301。大小写、末尾斜杠、index.html、www 与协议这几类一般可以用整批规则处理,成本低、见效快。
- 追踪参数优先交给 canonical 处理。不要直接把带参数的路径 Disallow 掉,被 robots 拦住的 URL,其 canonical 也可能读不到。
- 内链、导航、站点地图、对外分享的链接统一改成规范形式,从源头上减少新变体产生。
- canonical 是提示而非命令,能配合 301 就配合,不要只留下这一套弱信号。
哪些变体不要急着收敛
带参数的筛选页如果本身对应稳定的搜索需求、内容也确实不同,就不该一刀切 301 到主列表页。先判断它有没有独立价值:内容是否稳定、是否有人主动搜、是否已有外部链接指向它。有价值就让它作为独立页面存在,canonical 指向自身,同时控制它被大规模抓取的范围;没价值的参数组合再用规则统一收掉。
改完之后怎么验证
不要只看一两天。用归一化之后的口径去对比:
- 日志里变体 URL 的抓取次数是否下降,规范版本的抓取是否相应上升。
- 索引里变体地址是否在逐步退出。这一步通常比抓取变化慢,需要更长观察期。
- 新生成的内链和 URL 里,是否还有新的变体冒出来。
如果几周后仍有变体在被大量抓取,多半说明源头没堵住:要么还有旧链接在外散播,要么服务器规则没覆盖到某一类写法。
URL 变体不是一次就能清干净的事,它更像一种持续的卫生习惯:定好规范形式,让所有出口都用同一种写法,剩下的交给 301 和 canonical 慢慢收敛。