Nginx的server_name不支持直接写中文域名,必须使用RFC 3492标准转换的Punycode编码(如“中文.cn”转为“xn--fiq228c.cn”)进行配置,浏览器自动转换后即可正常匹配并路由。

Nginx 的 server_name 指令本身不支持直接写中文字符,因为 DNS 协议和底层网络栈只认 ASCII 字符。浏览器虽能自动将“中文.cn”转成 xn--fiq228c.cn 再发起请求,但 Nginx 配置文件必须用 Punycode 编码后的域名才能正确匹配。
所以,“混合使用中文域名与 Punycode”不是指在同一个 server_name 里混写(比如 server_name 中文.cn xn--fiq228c.cn; 这样写是无效的),而是指:配置时只写 Punycode,但允许用户用中文域名访问——这正是标准且唯一可行的做法。
✅ 正确做法:全部用 Punycode 配置,中文域名自然生效
- 浏览器输入
中文.cn→ 自动转为xn--fiq228c.cn→ 发起 HTTP 请求时Host头就是xn--fiq228c.cn - Nginx 匹配
server_name xn--fiq228c.cn;→ 成功路由到对应 server 块 - 用户无感知,体验上就是“用了中文域名”
你需要做的只有两步:
- 把中文域名用 RFC 3492 标准转成 Punycode(推荐工具:https://www.php.cn/link/993ae4a1829d8e9cea9eb96b3c83e648 或 https://www.php.cn/link/2b384afa1ad2d96062f89b8015f62452)
- 在
server_name中填入转换后的字符串,不要加引号,不要混写中文
例如:
server {
listen 80;
server_name abc.cn xn--fiq228c.cn; # ✅ 合法:两个 Punycode 域名并列
root /home/123/123Page;
index /1/123Page.html;
}注意:
-
abc.cn是纯 ASCII,无需转换;中文.cn必须转为xn--fiq228c.cn - 多个域名用空格分隔,不支持逗号或引号包裹
- 不要写成
server_name "中文.cn" xn--fiq228c.cn;—— 引号会导致匹配失败
❌ 常见错误与后果
直接写
server_name 中文.cn;
→ Nginx 启动报错:invalid server_name,或静默忽略该条目,导致请求落到默认 server混用大小写或多余空格,如
server_name xn--FIQ228C.CN ;
→ Punycode 区分大小写,XN--FIQ228C.CN≠xn--fiq228c.cn,匹配失败把
.中国、.公司等中文顶级域也当成普通中文处理
→ 实际需整体编码,例如example.中国→example.xn--fiqs8s,不能只编“中国”
? 补充:如何验证是否生效?
- 用
curl -H "Host: xn--fiq228c.cn" http://your-server-ip模拟请求,看返回内容是否为你预期的页面 - 查看 Nginx 访问日志,确认
Host字段确实是 Punycode 形式 - 在浏览器开发者工具 Network 标签中,检查请求的
Request Headers → Host值
不复杂但容易忽略


















