浏览器很宽容。地址栏里输入带中文、带空格的 URL,敲回车照样能打开,复制粘贴到别处也看着正常。但这种宽容只存在于浏览器界面上。当同一个地址被写进内链、sitemap、canonical 标签或者提交入口时,写法稍有差别,就可能变成蜘蛛眼里的另一个 URL。
浏览器帮你补了什么
URL 规范里允许直接出现的字符是有限的。中文、空格、以及一部分符号并不在其中,需要做百分号编码(percent-encoding)才能成为合法地址。浏览器在发请求之前会自动完成这一步:空格变成 %20,一个中文字通常变成三个字节的编码,比如 %E4%B8%AD。
问题就出在这个自动转换上。你在页面里手写链接、在后台配置跳转、或者从 Excel 里复制一批 URL 时,工具不一定帮你转换,或者转换用的编码方式不一样。结果是同一份内容,站内出现了几套不同写法的地址。
几个常见的出错场景
- 空格处理不一致。路径里的空格必须是 %20;查询参数里的空格有时被写成加号,而加号在路径中就是加号本身,不是空格。同一个关键词,两种写法指向的可能是不同结果。
- 编码字符集不同。同一段中文,用 UTF-8 编码和用 GBK 编码得到的百分号串完全不同。旧系统导出链接时容易出现这种情况。
- 十六进制大小写混用。%e4 和 %E4 在多数服务器看来等价,但作为字符串它们并不相同,缓存、去重、日志统计都可能把它们分开。
- 把斜杠编码进路径。%2F 表示的是斜杠字符本身,而不是目录分隔符。有些服务器会直接拒绝,有些会还原成目录层级,行为不一致。
- 中文域名与中文路径混用。域名部分的国际化处理和路径编码是两套规则,放在一起时更容易出错。
统一写法比选哪种编码更重要
规范并没有强制规定站内必须用哪一种编码形式,真正影响收录的是一致性。同一个页面,如果导航里是一种写法、正文推荐链接是另一种写法、sitemap 里又是第三种,蜘蛛抓到的就是几个内容相同、地址不同的页面。接下来就会触发规范化判断:它需要自己决定留哪一个,而这个过程未必按你的意愿走。
建议的做法是固定一套:
- 路径和参数统一使用 UTF-8 的百分号编码,十六进制字母统一大写。
- 能不用中文路径就不用。用拼音或英文做目录名,中文只在参数值里出现,出问题的概率会小很多。
- 页面里的内链、sitemap、canonical、跳转规则,都从同一个来源生成,不要各处手写。
- 如果历史原因已经存在多种写法,选一个作为标准,其余用 301 指向它。
编码问题很少直接导致页面被拒收,它的杀伤力在于制造出一批看起来像重复内容的地址,让蜘蛛在几个等价 URL 之间做选择。
发现疑似重复地址后的排查顺序
- 先确认是不是编码差异。把几个可疑地址手工解码一次,看解码后的字符串是否相同。
- 检查服务器日志,看这些写法是否都真实被请求过,各被请求了多少次。
- 用抓取工具请求每一种写法,观察返回的状态码、最终落地的 URL 和页面内容是否一致。
- 查 canonical 标签和 sitemap 里写的是哪一种,和实际被抓取最多的是否一致。
- 确定标准写法后,统一站内链接,把其他写法做 301,并在 sitemap 里只保留标准版本。
顺手检查的两个地方
一是站内搜索、筛选、分页生成的链接。这类 URL 往往由程序拼接,参数里带中文关键词时最容易出现编码不统一,数量还可能很大。二是从旧站迁移过来的链接,尤其是手工整理过的列表,写法常常五花八门。
编码本身是个小问题,处理起来也不复杂,但它属于基础设施层面的东西。地址写法不统一,后面做 canonical、做站点地图、看日志,都会多出一层解释成本。花点时间把 URL 生成规则固定下来,比事后一个个纠正要省事得多。