很多站点在做内容时,栏目名、文章标题、图片文件名直接用了中文,系统自动生成的 URL 也就带着一长串百分号编码。对访客来说还能点得进去,对搜索蜘蛛来说,却可能出现「同一个页面好几个地址」「链接抓过去 404」「日志里成片抓取失败」这些问题。这篇从编码角度梳理一下,哪些位置容易出错,可以怎么统一。
编码本身没有错,问题出在不统一
URL 规范里,非 ASCII 字符需要先按某种字符集编码,再写成百分号形式。中文「中」在 UTF-8 下是 %E4%B8%AD,在 GBK 下是 %D6%D0。两种写法在浏览器里看起来都能打开同一个页面,但对搜索蜘蛛来说,这就是两条不同的 URL。如果站点里一部分链接走 UTF-8、一部分走 GBK,或者前后端用了不同的编码函数,同一篇内容就会被拆成多个入口,外链、内链、分享链接各自指向不同版本,权重自然被分散。
容易出问题的几个位置
- 中文栏目名、中文文章 slug,尤其是编辑在后台手填标题就直接生成地址的站点。
- 空格的处理方式不一致:有的是 %20,有的是 +,有的被替换成连字符,三种写法同时存在。
- 半角全角符号混用,括号、书名号、顿号、中点等符号在编码后长度不同,容易出现断链。
- 文件名里带了 #、?、& 这类保留字符,编码后语义被截断,蜘蛛拿到的地址和实际资源对不上。
- 大小写不统一的编码,例如 %2f 与 %2F,在部分服务器上被当作不同路径。
- 站内搜索关键词直接落到 URL 上,用户搜一次生成一批新地址,抓取预算被大量消耗。
常见的错误写法
一个典型场景是老站点改版:早期用 GBK 生成的链接还挂在别的站点的外链里,新站按 UTF-8 生成地址,两边指向同一篇内容。蜘蛛顺着外链抓到旧地址,服务器返回 200,页面照常显示,于是旧地址也被收录,和新的规范地址打架。另一种场景是前端用 encodeURI、后端自己拼字符串,两个函数对保留字符的处理规则不一样,同一个标题在两处生成出不同的地址。
可以落地的处理思路
- 优先使用英文或拼音 slug,把中文标题保留在 title 和 H1 里。地址短、无编码、便于人手动输入,是最省事的方案。
- 如果业务上必须保留中文 URL,就全站统一按 UTF-8 编码,并确认服务器能正确解码,不要混用字符集。
- 把 URL 生成收敛到一个函数里,前端、后端、模板都调它,避免同一标题生成多个版本。
- 空格统一用连字符 -,不要用 + 或 %20。
- slug 里剔除 #、?、&、/ 等保留字符,用连字符替代。
- 对已经存在的旧编码地址做 301 到规范地址,尽量不要再让两个版本同时返回 200。
- 站内搜索结果页加上 noindex,并避免被大量内链暴露,减少无意义的抓取。
顺手做一次日志自查
打开服务器日志,筛选带 % 的请求行,大致能看到三件事:有多少编码 URL 被频繁抓取;这些请求的响应码是 200 还是 404;同一条路径是否存在多种编码形式。再抽查几条编码 URL,看它们的状态码、canonical 指向和规范地址是否一致。如果发现同一篇内容有两个都能打开的地址,先把其中一个 301 掉,比事后慢慢等收录收敛要快。
编码问题的本质不是「中文 URL 不好」,而是同一个页面被编码成了多个地址。先把地址收敛到一条,再谈收录。
这件事不需要大改架构,多数情况下只是把生成规则统一、把历史遗留的旧地址重定向一次。花半天时间整理清楚,后面做栏目规划、内容更新时就不用每次都重新踩一遍同样的坑。