做中文网站,迟早要面对一个问题:文章链接里的 slug 用中文、拼音还是英文?中文看起来最直观,可一复制出来就变成一长串 %E4%B8%AD...;英文简洁,但中文读者未必看得懂;拼音介于两者之间,又常被吐槽"不伦不类"。
这个问题我在自己的博客上就有现成的例子:这个站早年用 WordPress 时留下了一批中文 slug,存储下来就是 /posts/%e4%bb%8a%e5%b9%b4%e7%9a%84... 这样的编码形式;后来的文章有的用拼音(如 jin-nian-de-jian-fei-mu-biao-zhong-yu-da-cheng-le),最近的则基本用英文(如 how-to-resolve-git-pull-conflict)。三种风格同时存在,正好可以拿来对比。
这篇就从原理、搜索引擎的态度、实际使用中的坑,到不同场景下的选择建议,把这件事讲清楚。
中文 URL 是怎么工作的
URL 本身只认 ASCII
按照 URI 标准(RFC 3986),URL 里只能出现有限的 ASCII 字符。中文要放进 URL,需要先转成 UTF-8 字节,再对每个字节做百分号编码(percent-encoding)。比如:
中文网址 → %E4%B8%AD%E6%96%87%E7%BD%91%E5%9D%80一个汉字在 UTF-8 下占 3 个字节,编码后就是 9 个字符。一个 10 个字的中文标题,放进 URL 就有 90 个字符。
后来的 IRI 标准(RFC 3987)允许在"展示层"直接使用 Unicode 字符,浏览器地址栏里看到的中文就是 IRI 形式,但真正在网络上传输时,仍然会转换回百分号编码的 URL。
域名和路径是两回事
中文域名(IDN,国际化域名)用的是另一套机制:Punycode。比如 中文.com 实际解析的是:
中文.com → xn--fiq228c.com而路径部分(域名后面的 /posts/...)用的是上面说的 UTF-8 百分号编码。这篇讨论的主要是路径里的中文,也就是文章 slug。
编码的大小写
百分号编码里的十六进制字母大小写在标准上是等价的,%E4 和 %e4 表示同一个字节,RFC 3986 建议统一用大写。但现实中,WordPress 等系统存储 slug 时常用小写,而浏览器、某些工具生成的是大写。如果程序直接拿字符串做比较(比如缓存键、统计报表、重定向规则),就可能把同一个页面当成两个不同的 URL。
搜索引擎怎么看
Google 的官方立场比较明确:
- 支持 UTF-8 编码的 URL。在 Google 搜索中心关于 URL 结构的文档里,示例中就包含使用非 ASCII 字符的 URL,建议按需使用 UTF-8 编码。
- 建议 URL 使用简单、有描述性的词语,并且可以使用目标受众的语言。
- URL 中的关键词对排名的影响很小。Google 的人员多次公开表示,URL 里的词只是非常轻微的信号,远不如内容本身、标题和链接重要。
所以对 Google 来说,中文 URL 不会被惩罚,英文或拼音 URL 也不会因此占多大便宜。在 Google 的搜索结果里,URL 通常以面包屑形式显示,中文路径一般会解码成可读的中文。
百度
百度在搜索资源平台的相关指南里,一贯建议 URL 简短、易读、结构清晰,避免过长和过多的参数。中文 URL 百度是可以抓取和收录的,但它没有像 Google 那样明确推荐使用中文路径。
从实际情况看,国内很多大站的内容页用的是数字 ID 或拼音,很少使用中文路径。中文 URL 的主要风险在于:编码导致 URL 过长,以及抓取、提交、统计各环节中可能出现的编码不一致问题。我的看法是,以百度为主要流量来源的站点,没有必要冒这个险。
实际使用中的影响
搜索引擎只是一方面,中文 URL 在日常使用中的麻烦反而更多。
分享时变成一长串乱码
在浏览器地址栏里看到的是中文,但一复制,粘贴出来的往往是编码后的形式:
https://example.com/posts/%E5%A6%82%E4%BD%95%E9%80%89%E6%8B%A9slug发到微信、QQ、邮件、论坛里,就是一长串看不懂的字符,不仅难看,还会让一部分人怀疑这是不是钓鱼链接。有的平台还会在换行时把链接截断,导致点开就是 404。
URL 长度
中文编码后长度膨胀 3 倍以上。虽然现代浏览器和服务器对 URL 长度的限制都很宽松,但过长的 URL 在搜索结果、短信、二维码、日志里都很不友好。
工具和链路中的兼容问题
一个请求从用户到服务器,会经过浏览器、CDN、反向代理、Web 服务器、应用程序,以及各种统计和监控工具。每一个环节都可能对 URL 做编码或解码,常见的问题有:
- 二次编码:
%E4被再编码一次变成%25E4,路由匹配不上,直接 404。CMS 迁移、导入导出、拼接重定向地址时特别容易出现。 - 大小写不一致:同一个页面在统计工具里被拆成两条记录,或者缓存命中率下降。
- 日志可读性差:服务器日志和报表里全是编码字符串,排查问题时要先解码。
- 部分老旧工具、插件、爬虫对非 ASCII 路径处理不完善。
服务器配置
Nginx 的 location 匹配和 Apache 的 mod_rewrite 规则,一般是针对解码后的路径进行匹配的;而 Nginx 的 $request_uri 变量保留的是原始编码形式。写涉及中文路径的重写或跳转规则时,要清楚自己匹配的是哪一种形式,否则规则看起来没问题,实际就是不生效。
CMS 自动生成中文 slug
WordPress 默认会根据文章标题生成 slug,标题是中文时,slug 就是中文(数据库里存的是小写的百分号编码)。很多人从来没注意过这一点,写了几年才发现全站都是中文 URL。可以在发布前手动改 slug,或者用插件自动转成拼音或英文。
可读性和点击率
公平地说,中文 URL 也有优点:在浏览器地址栏、Google 面包屑中显示为中文时,中文读者一眼就能看懂页面讲什么,对点击率可能有一些正面作用。只是这个优势在复制分享的场景下就消失了。
四种 slug 风格对比
- 中文:对中文读者最直观,展示时可读性最好;缺点是复制后变成编码乱码、长度膨胀、各环节容易出现编码问题。
- 拼音:纯 ASCII,没有编码问题,中文用户大致能读出来;缺点是长了难以辨认,同音字多,国际用户看不懂,看起来不太专业。
- 英文:纯 ASCII,简短,国际通用,技术类内容尤其合适;缺点是需要为每篇文章想一个英文 slug,部分中文读者看不懂。
- 数字 ID:最短、永不冲突,标题修改也不影响 URL;缺点是 URL 里没有任何描述信息,对用户和搜索引擎都不够直观。
还可以组合使用,比如 /posts/123/lxc-vs-docker,既有稳定的 ID,又有可读的描述。
不同场景下的建议
只面向中文用户的新站
我倾向于用简短的英文或拼音 slug。如果你非常在意中文可读性,用中文也不是不行,但要控制长度,并且确认 CDN、统计、重定向等环节都正确处理编码。以百度为主要流量来源的,建议避开中文路径。
面向国际用户或中英双语
用英文 slug。多语言站点可以各语言用各自语言的 slug,但要配合 hreflang 等标记做好语言版本关联。
已有中文 URL 的老站
不要为了"优化"而批量修改已经被收录、有排名的 URL。URL 中的关键词对排名影响很小,而大规模改 URL 带来的风险(收录波动、外链失效、社交分享失效)是实实在在的。新文章可以用新的规则,老文章保持原样,这个博客目前也是不同时期的 slug 风格并存。
如果一定要修改 URL
确实有必要修改时(比如原来的 URL 有编码问题、过长,或者整站改版),务必做好以下几点:
- 每个旧 URL 都做 301 永久重定向到新 URL,一一对应,不要全部跳到首页。
- 更新站内所有内链,不要依赖重定向来跳转。
- 更新 sitemap,只包含新 URL。
- 确认新页面的 canonical 指向自己的新 URL。
- 在 Google Search Console 和百度搜索资源平台提交新的 sitemap,观察抓取和收录情况。
- 重定向规则长期保留,不要过几个月就删掉。
Nginx 上一个简单的重定向示例:
# 旧的中文路径(Nginx 匹配的是解码后的路径)
location = /posts/中文网址 {
return 301 /posts/chinese-url;
}数量多的话,建议用 map 指令集中维护新旧地址的对应关系,或者在应用层实现重定向表。
总结
- 中文 URL 在技术上完全可行,传输时会被转成 UTF-8 百分号编码;中文域名则用 Punycode。
- Google 支持 UTF-8 URL,URL 中的词对排名影响很小;百度建议 URL 简短易读,对中文路径没有特别推荐。
- 中文 URL 的主要问题不在 SEO,而在分享时变成乱码、长度膨胀,以及各环节的编码兼容问题。
- 新站建议使用简短的英文或拼音 slug,国际化站点使用英文。
- 老站已有排名的中文 URL 不要轻易批量修改;确实要改,一定做好 301、内链、sitemap 和 canonical。
URL 是网站的"门牌号",一旦对外公开就应该尽量保持稳定。比起纠结用什么文字,更重要的是从一开始就定好规则并坚持下去。




暂无评论