抓取量和收录量对不上,有一部分原因不在内容,而在地址。同一个页面在站内同时以几种写法存在——/About 与 /about、带结尾斜杠与不带、带一串 utm 参数与不带——蜘蛛会按不同 URL 分别排队。抓取次数被摊薄,站内链接的权重被拆到几个地址上,日志看着热闹,最后进索引的可能只有一个,甚至几个版本互相顶替。
先分清哪些差异真的会裂成两个地址
判断标准只有两条:服务器对这两种写法返回的内容是否相同,站内是否存在指向两种写法的链接。两条都成立,才算真正需要处理。
- 服务器已经把其中一种 301 到另一种,站内链接也统一——不用管。
- 服务器返回 200 且内容一致,站内两种写法都有链接——需要收敛。
- 服务器返回 200 但内容不同(比如大小写对应两套页面)——这不是重复问题,是两份内容,各自正常处理。
几类常见的写法差异
路径大小写
URL 路径在多数服务器上区分大小写,主机名不区分。站内链接、sitemap、后台生成的地址如果混用大写,很容易造出两份。做法是站内统一小写,服务器对已知的大写变体做 301,而不是让它返回 404,或者也返回一份 200。
结尾斜杠
/about 与 /about/ 在很多服务器上是两个不同路径。选定一种作为规范,另一种 301 过去。混合出现时,日志里会看到两条路径各自被反复抓取,站内链接的锚文本也被拆成两份。
协议与主机名
http 与 https、带 www 与不带 www,全站只保留一个规范版本,其余 301。这一步最好在服务器或 CDN 层一次做完,而不是靠页面里的 canonical 兜底——canonical 是提示,重定向是明确指令,处理优先级不一样。
查询参数
参数顺序不同、参数名大小写不同、带上 utm 与 gclid 这类追踪参数,都会生成新地址。几件事可以一起做:站内链接和 sitemap 里不带追踪参数;页面模板不做无意义的参数拼装;页面 canonical 指向不带参数的版本。要注意的是,不要用 robots.txt 去屏蔽这些带参数的地址——被屏蔽之后,canonical 这条提示蜘蛛读不到,收敛就断了。
编码与锚点
中文、空格、特殊字符的百分号编码存在大小写两种形式,建议在生成链接时统一。锚点(# 后面的部分)不参与服务端请求,一般不会造成重复地址,但分享按钮拼出来的带锚点链接,最好确认服务端返回的仍是同一个页面。
收敛的落地顺序
- 从访问日志里按路径聚合,统计同一页面出现了多少种写法,以及各自被抓取的次数。
- 在服务器或 CDN 层对非规范写法做 301,优先处理抓取次数多的那些。
- 站点内部链接、导航、sitemap、RSS 全部改成规范写法,从源头不再产生新变体。
- 页面 canonical 指向规范地址,作为最后一道兜底。
- 改完后观察一段时间的日志,看非规范路径的请求量是否下降。
怎么确认收敛生效
不要只看站长平台的覆盖率报告,那个更新有延迟。更直接的办法是在日志里继续按路径聚合,看非规范写法是否还在被请求、请求量是否在减少。同时抽查几个页面的搜索展现,确认留下的是规范版本。如果非规范地址仍在被抓,通常是站内某处还在输出旧写法,回到第二步往前找。
URL 归一化不是一次性动作。模板改版、活动页上线、分享组件更新,都可能重新引入不一致的写法。把日志聚合当成一个定期动作,比一次性清理更实在。
把地址收敛到一个版本,本身并不保证页面被收录,它解决的是让抓取和信号不被拆散。在这个前提下,再去看页面质量、内容深度这些真正影响收录的因素,判断才不会被地址问题干扰。