新站用了中文域名,Nginx 的 server_name 直接写中文,配置能通过 nginx -t,实际访问却落到默认站点,日志里主机名显示的是 xn-- 开头的编码。

这类报错背后常见的原因有几处,逐个排除就行。Nginx 匹配的是 punycode 形式,中文字符串永远不命中。另一种情况是证书也需要按 punycode 签发,中文名不在 SAN 里。

少数情况下是部分 CDN 控制台要求填转码后的域名。

第一件事是确认请求头里的实际主机名

curl -sI -H "Host: xn--fiqs8s.example" http://127.0.0.1/ | head -2

然后配置里改用转码后的名字

server_name xn--fiqs8s.example www.xn--fiqs8s.example;

等前面都确认过,再核对证书覆盖的 SAN

openssl x509 -in fullchain.pem -noout -text | grep -A1 "Subject Alternative Name"

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

恢复的判定其实很直接。中文域名与转码域名访问都返回 200,证书 SAN 里包含 xn-- 前缀,日志里不再落到 default_server。

容易忽略的是,中文域名看着友好,实际链路里全是转码,配置、证书、CDN 三处都要用同一种写法。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189