中文域名与 IDN:好用还是坑

中文域名听起来很美,但实际用起来有不少坑。先搞清楚它怎么工作,再决定要不要买。

一、底层是 punycode

DNS 系统只认 ASCII。中文域名会被编码成 xn-- 开头的 punycode:

bash
白泽.net  →  xn--hjqp4w.net

# 用命令转换
# Python
python3 -c "print('白泽.net'.encode('idna').decode())"
# xn--hjqp4w.net

浏览器地址栏显示中文,实际请求用的是 punycode。

bash
dig +short xn--hjqp4w.net A

二、兼容性问题

场景支持情况
现代浏览器✅ 地址栏显示中文,自动转换
邮件地址⚠️ 部分邮件系统不支持
命令行工具⚠️ 需要手动转 punycode
部分 App 内 WebView⚠️ 可能显示错乱
证书签发✅ 支持,但要用 punycode 申请
老系统
bash
# Let's Encrypt 申请中文域名证书
sudo certbot --nginx -d xn--hjqp4w.net

三、最大的问题:同形异义字钓鱼

不同字符的 Unicode 可能长得一模一样

bash
拉丁字母 a  vs  西里尔字母 а    → 肉眼无法区分
拉丁字母 o  vs  西里尔字母 о
中文「白」 vs  日文汉字「白」(字形略有差异)

攻击者可以注册一个看起来完全一样的域名做钓鱼。所以浏览器有防护规则:

  • 如果域名混用了多种语言的字符,浏览器会直接显示 punycodexn--...)而不是原文;
  • 纯中文(或纯某种非拉丁文字)的域名才显示原文。
bash
白泽.net      → 显示「白泽.net」(纯中文,安全)
аpple.com     → 显示 xn--pple-43d.com(混用了西里尔字母,警告)

四、实际使用中的问题

1. 输入法切换很烦

用户要访问你的站点,得先切中文输入法打出「白泽」,再切英文输入 .net。这个体验很差。

2. 口头传播困难

bash
"我的域名是 baize dot net"              → 清楚
"我的域名是白泽点net"                   → 哪个白?哪个泽?

3. 部分场景不支持

  • 一些表单验证会拒绝非 ASCII 域名;
  • 部分 CDN、监控服务对 IDN 支持不完整;
  • 日志文件里是 punycode,排查时不好认。

4. 价格通常更贵

中文域名续费价往往高于普通 .com

五、什么时候值得注册

场景建议
主域名❌ 不推荐用纯中文
品牌保护⚠️ 可考虑,防止别人注册
面向不熟悉英文的用户⚠️ 可作为跳转域名
营销活动短链⚠️ 有意义,但要配合跳转

比较务实的用法:注册中文域名,301 跳转到你的主域名

nginx
server {
    listen 443 ssl;
    server_name xn--hjqp4w.net;
    ssl_certificate     /etc/letsencrypt/live/xn--hjqp4w.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/xn--hjqp4w.net/privkey.pem;

    return 301 https://www.bzii.cn$request_uri;
}

这样中文域名成为一个「入口」,实际站点还是英文域名(兼容性最好)。

六、如果要用,注意这些

bash
# 1. 确认注册商支持 IDN
#    大部分支持,但管理界面可能显示 punycode

# 2. 证书要用 punycode 申请
sudo certbot certonly --nginx -d xn--hjqp4w.net

# 3. 配置文件里写 punycode
server_name xn--hjqp4w.net;    # 不要写中文

# 4. DNS 记录填 punycode
dig +short xn--hjqp4w.net A

# 5. 邮箱也要考虑:中文邮箱兼容性更差

七、emoji 域名

技术上可行(也是 punycode),比如 xn--e28h.com(😀.com)。

bash
python3 -c "print('😀.com'.encode('idna').decode())"
# xn--e28h.com

但兼容性更差,且很多注册商不允许。当成玩物就好,别用在正式场景。

八、检查与调试

bash
# 中文转 punycode
python3 -c "print('白泽.net'.encode('idna').decode())"

# punycode 转回中文
python3 -c "print('xn--hjqp4w.net'.encode().decode('idna'))"

# 用 idn 命令(需装 idn2)
idn2 白泽.net

# 查解析
dig +short xn--hjqp4w.net A

九、我的结论

bash
主域名:用英文/拼音        → www.bzii.cn
品牌保护:可注册中文域名    → 白泽.net → 301 跳转
不要:把中文域名当主入口

理由很实际:

  1. 输入成本高(切输入法);
  2. 兼容性不确定(各种 App、邮件、老系统);
  3. 口头传播困难
  4. 跳转方案能拿到中文域名的好处(好记、本土化),又避开它的坑。

中文域名不是「不好」,而是成本收益不划算。用 301 跳转的方式,是它最合理的用法。