做站点运营时,常会遇到一种情况:自己觉得只有一个页面,索引里却出现了好几个地址。它们内容一样,只是大小写不同、末尾多了或少了一个斜杠,或者协议、域名前缀有差异。搜索引擎不会自动把这些地址合并成一个,除非你给出足够明确的信号。
常见的 URL 变体有哪些
先分清哪些差异属于同一页面的变体。多数情况下,下面这些地址返回的内容完全相同:
- 大小写差异:/About 和 /about。有些服务器不区分大小写,但 URL 字符串本身不同。
- 末尾斜杠:/guide 和 /guide/。服务器可能自动跳转,也可能两个都返回 200。
- 协议差异:http:// 和 https://。迁移到 HTTPS 后,旧协议如果仍可访问,就多了一套地址。
- 域名前缀:example.com 和 www.example.com。两者都解析时,会形成两套入口。
- 默认文件名:/index.html 和 /。目录首页的两种写法。
带参数的筛选、排序和追踪参数也属于这一类,但处理思路更复杂,通常要结合参数的作用单独判断。
为什么它们会被当成不同 URL
对爬虫来说,URL 首先是一串字符串。只要服务器返回 200,并且没有明确的 canonical 或重定向信号,它就有理由把每个变体当作独立地址来抓取和索引。即使页面内容一致,索引系统也可能先分别收录,再尝试选择规范版本。这个选择过程不一定和你期望的一致。
变体越多,抓取和索引里需要处理的对象就越多。原本一个页面的事,可能变成几个页面的事。
统一 URL 的处理顺序
1. 先选定规范版本
在动手改之前,先确定每个页面最终要用哪个地址。通常优先选已经有一定外链和收录的版本;如果是新站,按自己的习惯定好即可,比如统一使用小写、不带末尾斜杠、HTTPS、带 www 或不带 www。关键是全站保持一致。
2. 用 301 把变体指向规范版本
如果变体地址不应该继续存在,优先用 301 重定向。它比 canonical 更直接:用户和爬虫访问旧地址时,会直接到达规范版本,不再看到旧页面内容。注意不要用 302 或 JS 跳转来替代,也不要让重定向链过长。
3. 用 canonical 处理无法重定向的情况
有些变体必须保持可访问,比如带追踪参数的落地页,或者服务器配置暂时无法改。这时可以在页面 head 里用 canonical 指向规范版本。canonical 是提示,不是强制指令,但它能帮助索引系统理解你的选择。canonical 指向的地址最好是 200 状态、可抓取的规范页面,不要指向 404 或另一个重定向地址。
4. 内部链接、sitemap 和导航保持一致
这是最容易被忽略的一步。如果站内链接一会儿用 /about,一会儿用 /About/,爬虫就会不断发现新变体。把导航、正文链接、面包屑、sitemap、RSS 里的地址统一成规范版本,能减少后续变体产生的机会。
容易踩坑的地方
- canonical 和 301 指向不同地址,信号互相矛盾。
- 服务器对大小写不敏感,但站内链接混用大小写,导致爬虫反复抓取同一路径的不同写法。
- 末尾斜杠自动跳转正常,但 sitemap 里仍保留旧写法,形成两套发现入口。
- canonical 指向的页面本身也被 robots.txt 禁止抓取,导致提示无法生效。
- 只处理首页,忽略了栏目页和详情页也存在同样的变体。
怎么检查有没有被拆开
- 用 site: 查询观察同一内容是否出现多个地址,注意这只是粗略参考。
- 在 Search Console 的页面报告里查看“重复网页,Google 选择的规范网页与用户指定的不同”等状态。
- 翻服务器日志,看爬虫是否在抓取大小写、斜杠或协议不同的同一路径。
- 用第三方工具对比索引和实际页面,找出多余的变体地址。
处理这类问题的顺序通常是:先统一站内链接和 sitemap,再对已有变体做 301 或 canonical,最后观察一段时间。不要因为一时看到重复记录就频繁更换规范版本,信号反复变化反而会让索引系统难以判断。