在抓取统计或服务器日志里,你可能见过这种情况:同一篇文章对应好几条 URL,参数顺序不同、大小写不同、结尾多一个斜杠,甚至主机名都不一样。这些地址打开后是同一份内容,但在搜索蜘蛛眼里,它们是几个各自独立的 URL。索引里最终挑中哪一版,通常不完全由你决定,所以更稳的做法是在站点层面先把地址归一。
常见的 URL 变体
- 协议与主机名:http 与 https 并存、带 www 与不带 www、带默认端口与不带端口。
- 路径写法:结尾加不加斜杠、是否附带 /index.html 或 /index.php、目录名的大小写不同。
- 参数部分:筛选参数顺序不同、跟踪参数被写进内部链接、会话 ID 直接拼在地址里。
- 历史遗留:改版前的旧路径仍能访问、CDN 回源地址被页面引用、测试环境域名偶然被放出到公网。
为什么归一比删内容更优先
多个版本同时被抓取,抓取额度被同一份内容摊薄;外链和站内链接分散在几个地址上,页面获得的信号也被摊薄。更麻烦的是,索引里的选择并不固定:今天留下带 www 的那一版,过一段时间可能又换成另一个,统计口径随之变化。
URL 归一是“让同一份内容只对应一个地址”,而重复内容处理是“不同内容之间如何取舍”。前者是后者的前提。
推荐的处理顺序
- 选定唯一地址,把协议、主机名、路径写法、参数处理规则写成规范,并落到模板和构建流程里,而不是靠人工逐个改。
- 把其它版本 301 到唯一地址,尽量一跳到位,避免 A→B→C 的链式跳转。
- 站内链接、导航、分页、面包屑、结构化数据里的地址全部换成唯一版本。
- 站点地图只放唯一版本,各种变体不要出现在里面。
- canonical 可以作为补充声明,但它替代不了 301:canonical 是提示,服务器跳转是明确指令。
- 不要用 robots.txt 去挡变体。挡住抓取后,蜘蛛既看不到跳转也看不到 canonical,这些地址反而可能继续留在索引里。
验证归一是否生效
- 在日志里按主机名和路径去重统计,观察变体地址的请求占比是否下降。
- 用命令行工具查看变体地址的响应码和 Location 头,确认是一跳 301,而不是 200 或多跳链路。
- 用站内查询或搜索控制台的网页报告,看同一份内容对应的地址数量变化。
- 注意索引更新有滞后,地址替换通常需要数周,不要改完第二天就下结论。
容易踩的坑
- 以为大小写无关:部分服务器不区分大小写,迁移到区分大小写的环境后,/Page 和 /page 就成了两个地址。
- 忽略尾斜杠差异:有的框架把 /a 和 /a/ 当作不同资源处理。
- 同时做了两套归一:301 指向 A,canonical 却指向 B,等于给蜘蛛一个自相矛盾的信号。
- CDN 或反向代理把回源域名暴露在页面里,凭空多出一批可抓取的地址。
URL 归一属于一次性工程,做完之后再看重复内容、参数页、分页这些话题会清楚很多。先把地址统一,再谈索引里留下哪一版;顺序反过来,往往是事倍功半。