同一份内容在索引里出现两个地址,最常见的来源不是内容本身,而是 URL 写法不统一:一个带末尾斜杠、一个不带;一个全小写、一个大小写混用;一个指向目录、一个指向 /index.html;或者被外链带进来一串跟踪参数。这类问题不会让页面立刻掉出索引,但会分散内链指向、让日志与索引统计对不上,排查收录时很容易被带偏。
先看清“两个地址”到底差在哪
- 末尾斜杠:/guide 与 /guide/
- 大小写:/Guide 与 /guide(在部分服务器或框架上是同一资源,在另一些上是两个不同资源)
- 默认文件名:/guide/ 与 /guide/index.html
- 协议与主机名:http 与 https、www 与不带 www
- 跟踪参数:?utm_source=… 被外链或分享链接带进来
把这些类型先分开,再决定用哪一条规则收敛。多数站点只需要一条原则:一个页面只保留一种写法。
核对顺序:从访问返回开始
- 用带斜杠、不带斜杠、不同大小写的地址分别访问,看返回的是 200 还是 301、302。
- 如果多个写法都返回 200,说明服务器没有做归一化,这就是根因,先修这里。
- 对比两边页面的 canonical:如果各自指向自己,等于向搜索引擎声明这是两个独立页面。
- 统计内链:站内有多少链接指向 A 写法,多少指向 B 写法。
- 检查 sitemap、RSS、分页、面包屑里出现的写法是否一致。
- 在日志里看蜘蛛分别抓了哪些写法、状态码是什么、频率如何。
顺带确认:是不是真的同一份内容
有些写法不同,内容其实也不同,比如筛选参数改变了列表结果、或大小写在服务端映射到不同目录。这种情况不属于归一化问题,硬做 301 反而会丢页面。判断方法很简单:对比正文主体是否一致,而不只是看标题。
收敛动作,按代价从小到大
- 服务器层 301:把非规范写法 301 到规范写法,这是最彻底的一步,也是优先要做的。
- canonical 统一:两边都指向规范地址,作为过渡信号。
- 内链与 sitemap 统一:站内不再输出非规范写法,sitemap 只放规范地址。
- 外链处理:能联系到来源的请对方改成规范地址,联系不到的靠 301 兜住。
注意:301 与 canonical 不要互相打架。如果 A 301 到 B,而 B 的 canonical 又指回 A,信号会互相抵消,收敛过程会被拉长。
收敛之后看什么
不要当天就下判断。先在日志里确认非规范写法被抓到时返回的是 301,再观察一段时间内该写法的抓取量是否下降、规范写法的抓取量是否上升。索引里旧写法消失通常明显滞后,几周到几个月都可以算在正常范围内。
如果几个周期过去两个写法仍然都在索引里,回到第一步复盘:常见原因是还有没清理干净的入口,比如外站旧链接、模板里残留的拼接链接、被缓存住的分页路径。
日常怎么少踩这个坑
- 上线前把 URL 规则定下来,写进团队规范
- 链接由统一的生成函数输出,避免在模板里手写字符串
- sitemap 交给程序生成,只输出规范地址
- 定期用日志抽样,看是否存在非规范写法的抓取
URL 归一化属于基础工作,做一次能省掉后面很多“为什么收录数对不上”的解释成本。它不保证收录结果,但能让后续的判断有据可依。