在服务器日志里翻 URL 时,经常能看到同一个页面出现好几种写法:有的是未编码的中文,有的是 %E4%B8%AD 这样的百分号编码,还有的大小写十六进制混着来。这些写法指向的其实是一个页面,但在抓取和收录的视角里,它们可能被当成多个地址,需要额外做一轮合并。
中文 URL 不是不能用,麻烦在于写法不统一
URL 本身只接受一部分 ASCII 字符,浏览器在发送请求前会把中文、空格等字符转成百分号编码,通常按 UTF-8 编码字节转换。所以浏览器地址栏里看起来是「/标签/收录」,到了服务器日志里往往是一串 %E6%A0%87%E7%AD%BE。这中间只要有一环的写法不同,同一个页面就会多出一个「新」地址。
常见的几种分歧
- 未编码与已编码:站内有的链接直接写中文,有的写百分号编码。
- 编码大小写:%e6 与 %E6 在某些系统里被视作不同的字符串。
- 编码方式不同:UTF-8 与 GBK 编出来的百分号序列完全不一样。
- 空格的处理:路径里的空格应为 %20,写成 + 在路径中会被当成加号本身。
编码不统一,会带来哪些实际问题
最直接的是重复内容:同一篇正文挂在两个地址下,权重和外部链接被拆成两份,页面自己也不清楚该以哪一个为准。其次是抓取上的浪费,蜘蛛把两个地址都抓一遍,抓取资源被用在重复劳动上。第三是维护困难,改一次内链要同时改两种写法,漏掉一处就又多一条入口。
这不是致命问题,但会让本来清晰的收录状态变得不好判断——明明只有一个页面,覆盖率报告里却像有两个。
空格、加号、& 这些符号要单独留意
查询字符串里的 + 通常代表空格,但路径里的 + 就是加号,两者规则不同,混用会产生意料之外的地址。查询参数里的 & 作为分隔符出现,如果它本身就是参数值的一部分(比如标题里带 &),必须编码成 %26,否则后面的内容会被解析成新的参数。
这类细节造成的错误往往不是「页面打不开」,而是「打开的是另一个页面」,排查起来比 404 更费时间。
已经用了中文 URL,怎么把口收住
- 确定一种标准写法,通常选百分号编码的 UTF-8 形式,站内所有链接、导航、sitemap 都用它。
- 服务器对未编码形式也能正常响应,必要时用 301 跳到标准形式,而不是让两种写法都返回 200。
- 页面上的 canonical 指向标准形式的地址,不要在不同版本上写不同的 canonical。
- 提交 sitemap 时用标准形式,不要在 sitemap 里混入另一种写法。
- 隔一段时间看一次日志,确认蜘蛛请求的已经是主流形式,剩下的少量旧地址可以留着跳转。
新页面起名时更省事的做法
如果页面还没上线,路径用英文、拼音或数字能省掉后面几乎所有麻烦。中文标题照样可以显示在 title 和 H1 里,URL 不承担展示任务。
- 保持短:过长的 URL 在分享、复制、粘贴时容易被截断,也更容易写错。
- 保持稳定:不要把发布日期、版本号、活动期次这类会变的信息放进路径。
- 保持可读:拼音或英文关键词对人和对日志排查都友好。
- 参数从简:能用路径表达的层次就别用多层参数堆砌。
URL 编码本身不是问题,写法不统一才是。把同一个资源收口到一种地址上,收录状态才容易看清。
如果站内已经积累了不少中文 URL,不必急着全部改路径,把编码形式统一、把 canonical 与 301 做对,通常就能解决大部分重复入口的问题。改动之后留出观察周期,再看日志和覆盖率报告里的地址数量是否收敛。