为什么 URL 变体会影响收录
搜索引擎对 URL 的识别是字符串层面的。同一份内容如果可以通过多个地址打开,它不会自动合并,而是先当作多个候选。抓取配额被分散,权重被拆开,收录状态也可能一个正常一个异常。
更麻烦的是,变体之间互相内链、sitemap 里混着写、canonical 各指各的,最后你自己也说不清哪个是主版本。
常见的 URL 变体有哪些
- 协议:http 与 https
- 主机名:example.com 与 www.example.com
- 尾斜杠:/page 与 /page/
- 大小写:/Page 与 /page
- 默认文件:/ 与 /index.php、/index.html
- 参数顺序:?a=1&b=2 与 ?b=2&a=1
- 跟踪参数:?utm_source=... 等附加在正式 URL 后面
- 路径重复:/a//b、/a/./b
先找出变体,而不是先改
不要凭印象改。用工具或日志把同一路径的不同 URL 列出来。
- 打开服务器日志,按路径聚合,看同一路径出现了哪些 host、协议、尾斜杠写法。
- 用 site: 或抓取工具,检查同一内容是否被多个 URL 收录。
- 检查 sitemap、内链、canonical 三处指向是否一致。
- 对参数类 URL,看哪些是功能必需,哪些只是跟踪。
确定主 URL 的原则
主 URL 一旦定了,就不要频繁换。一般按这几个原则:
- 与证书、DNS 配置一致,能长期稳定提供服务的那个。
- 与站内绝大多数内链、sitemap 一致的那个。
- 对外分享、投放、二维码里已经在用的那个。
如果历史原因导致两种写法都有大量外链,选外链更多、更自然的那个作为主版本。
用三层动作把变体收拢
第一层:服务端跳转
对非主版本做 301 永久跳转,指向主 URL。http 到 https、非 www 到 www、去尾斜杠到加尾斜杠,都走这一层。跳转要在服务端完成,不要用 JS 或 meta refresh。
第二层:页面标注
每个页面写自指的 canonical,指向主 URL。注意 canonical 是建议不是命令,如果站内跳转和 canonical 指向不一致,搜索引擎会自己判断,结果不可控。
第三层:入口统一
sitemap、内链、分页、hreflang、结构化数据里的 URL 全部换成主版本。这一步最容易被漏掉,但恰恰是让搜索引擎确认口径的关键。
跳转、canonical、内链三者指向一致时,URL 归一才算完成;只做其中一项,往往还会留下变体。
参数类 URL 怎么处理
跟踪参数、排序参数、筛选参数要分开看。
- 跟踪参数:用 canonical 指回无参数版本,同时在站长工具里配置忽略参数。
- 排序、筛选:如果内容确实不同且用户会搜到,可以考虑保留;如果只是同一批内容的重新排列,用 canonical 或 robots 处理。
- 分页参数:保留可抓取的路径,别用 canonical 把第二页指回第一页。
判断标准很简单:这个参数 URL 打开后,用户看到的内容和主 URL 是否实质相同。
改完怎么看效果
- 先看跳转是否生效,用 curl -I 或浏览器开发者工具确认状态码是 301。
- 再看 canonical 是否自指且与跳转目标一致。
- 观察日志里非主版本的抓取是否逐渐减少,主版本抓取是否增加。
- 在索引覆盖报告里看重复类、已排除类的数量变化,但不要指望几天内归零。
如果跳转链出现多跳,比如 http 非 www 跳到 https 非 www 再跳到 https www,尽量合并成一跳,减少抓取损耗。
几个容易踩的坑
- 用 302 做长期归一,搜索引擎可能不传递权重,也不确认主版本。
- 跳转目标又指向一个变体,形成循环。
- 只在首页做跳转,内页没有覆盖。
- canonical 指向 404 或重定向 URL。
- sitemap 里同时提交多个变体,等于主动告诉搜索引擎“这些都要抓”。
总结一句:URL 归一不是一次性的技术动作,而是把“同一个页面只有一个正式地址”这件事在服务端、页面标注和入口三处对齐。对齐之后再看收录,很多“收不进去”或“重复收录”的困惑会少一大半。