排查收录问题时,日志和索引里有时会出现这样一种情况:同一个详情页出现好几条看起来不一样的地址,点开却是同一篇内容。仔细比对,差别只在中文关键词的编码形式上——有的保留中文原样,有的是 %E4%B8%AD 这种百分号编码,还有的把百分号后面的大写字母写成了小写。这类问题在中文站、含空格或括号的栏目路径里很常见,处理起来不难,但需要按顺序来。
一、一个页面为什么会有多个编码地址
URL 里能直接出现的字符是有限的,中文、空格、引号、竖线这些都要转成百分号编码才能被正确传输。问题往往出在转换环节:
- 不同工具、不同语言的编码函数对同一段文字可能给出不同结果,最常见的是百分号后字母大小写不一致。
- 路径里的空格编成 %20,查询参数里的空格有时被写成 +,这两种写法在部分场景下并不等价。
- 从 Excel、文档或后台编辑器里复制出来的链接,常常夹带不可见的空格或全角字符。
- 服务器对路径大小写敏感时,只有大小写不同的两条地址会被当成两个页面,各自独立被抓取。
结果就是:内链指向一种写法,sitemap 用另一种,外部引用又是第三种。爬虫见到几套地址,就会分别抓取、分别建索引,页面本身的信号也被拆散。反过来说,只要入口统一,这类问题大多数可以避免。
二、先核对范围,再动手改
确认影响面之前,不要急着加规则。可以从三条线索入手:
- 服务器日志:按路径前缀筛选,看同一页面对应几种不同的请求形式,各自占多少请求量、返回状态是否一致。
- 站点地图与内链:随机抽若干详情页,对比 sitemap、导航、面包屑和正文内链里用到的写法是否统一。
- 索引表现:用站内查询或索引报告看是否存在指向同一内容的多个地址,留意带参数的变体是否也被收进去了。
核对时把“地址写法”和“页面内容”分开记录。有些参数页本来就不该参与收录统计,混在一起会让判断失准。另外要顺带确认服务器对大小写的处理方式,这决定了后续要不要额外做映射。
三、处理顺序:先定规范,再统一入口
- 确定唯一规范地址。选一种写法作为标准,通常优先选可读性好、不含多余参数的那条。
- 非规范地址做一跳 301。直接指向规范地址,不要串成多跳链条,避免爬虫在跳转中消耗预算。
- 页面内写好 canonical。让 canonical 与 301 的目标保持一致,两处互相矛盾会让处理结果更难预测。
- 统一内链与 sitemap。把导航、面包屑、正文链接、站点地图都改成规范写法,这是减少新变体最有效的一步。
- 清理夹带字符。去掉链接里的全角符号、首尾空格和重复参数。
- 持续观察。日志里非规范写法的请求量下降、索引中的重复地址逐步收敛,才算这一步走完。
整个过程建议分批推进,先处理量最大的那类变体,观察一段时间再动下一批。一次性改完,出了问题不容易定位是哪一步引起的。
四、新建 URL 时就避开这个坑
与其事后归并,不如在建站和改版阶段就把规则定下来:
- 路径尽量用拼音或英文短语,把中文留给标题和正文。
- 栏目名和文件名统一小写,避免同目录下出现仅大小写不同的地址。
- 约定空格与特殊字符的编码方式,并把这条写进开发规范。
- 后台自动生成链接时统一走同一个函数,不要各处各写一套。
如果历史页面已经有大量中文路径,也不必全部推倒重来。把入口收口、把新页面规范起来,通常比大规模改 URL 更划算,风险也小得多。
需要提醒的是,统一编码、收敛入口只能减少重复、让抓取更顺畅,并不等于页面一定会被收录,也不代表展示位置会变好。内容是否有独立价值、站点整体质量如何,仍然是更根本的前提。