Nginx的server_name指令不支持UTF-8中文域名,必须使用Punycode编码后的ASCII域名(如“百度.中国”→“xn--4gq62f.xn--fiqs8s”)进行配置,且需确保DNS解析和SSL证书均采用对应Punycode格式。

直接在 server_name 指令中写 UTF-8 编码的中文域名(如 百度.中国)是无效的,Nginx 原生不支持 IDN 的 UTF-8 形式匹配。必须使用 Punycode 编码后的 ASCII 域名配置。
必须用 Punycode 格式配置 server_name
Nginx 的 server_name 只识别 ASCII 字符,国际化域名需先转为 Punycode(例如 百度.中国 → xn--4gq62f.xn--fiqs8s)。配置时只写转换后的字符串:
- 用在线工具或 PHP 的
idn_to_ascii()转换原始 IDN - 在 Nginx 配置中写:
server_name xn--4gq62f.xn--fiqs8s; - 不能混用,比如
server_name 百度.中国 xn--4gq62f.xn--fiqs8s;—— 前者会被忽略或导致语法错误
避免误用 HTTP_HOST 做匹配依据
不要试图在 server_name 中动态处理客户端发来的 Host 头(如 HTTP_HOST),因为:
-
server_name是静态匹配规则,不是运行时变量 - 浏览器发送 IDN 时已自动转为 Punycode,
HTTP_HOST值本身已是 ASCII,但 Nginx 不允许用变量替代server_name - 若强行用
map或if判断$host,无法改变虚拟主机路由逻辑,仅能做内部重写或 header 控制
多语言子域名建议用通配符 + Punycode 组合
如果要支持类似 中文.example.com、日本語.example.com 这类子域名,注意:
- 通配符
*不支持非 ASCII 字符,*.example.com无法匹配 IDN 子域 - 正确做法:对每个实际使用的 IDN 子域单独转 Punycode 并列出,例如:
server_name xn--fsq123.example.com xn--kcr234.example.com; - 若子域数量多,建议前端统一用 ASCII 子域(如
zh.example.com)+ 后端语言路由,避开 IDN 匹配限制
配套要点:确保 DNS 和证书也支持 IDN
仅 Nginx 配置正确还不够:
- DNS 解析记录(A/AAAA)必须指向该服务器 IP,且域名在 DNS 中注册的是 Punycode 形式(注册局层面已自动处理)
- SSL 证书需包含对应 Punycode 域名(主流 CA 支持,但不能写中文,必须填
xn--xxx) - 测试时用
curl -H "Host: xn--4gq62f.xn--fiqs8s" http://服务器IP验证匹配是否生效


















