Nginx支持中文域名的关键是使用Punycode编码(如xn--fiq228c.cn)配置server_name和TLS证书,而非原始中文域名;HTTP/2仅在正确启用TLS后生效,不参与域名编码处理。
HTTP/2 本身不处理域名编码,它只在 TLS 握手完成后传输加密的 HTTP 流量。Nginx 中支持中文域名的关键环节不在 HTTP/2 层,而在于 TLS 证书匹配 和 server_name 解析 两个层面——这两者都要求使用 Punycode 编码后的域名(如 xn--fiq228c.cn),而非原始中文(如 中文.cn)。
Let’s Encrypt 或其他 CA 不接受纯中文域名作为证书主体(Subject Alternative Name)。你必须:
评估侠.com)用在线工具(如 https://www.php.cn/link/cd930873f6112e4a49ed6c3704c0350c)转为 Punycode(xn--tpq9js60n.com)certbot --nginx -d xn--tpq9js60n.com
server_name 与证书 SAN 完全一致,即写成:server_name xn--tpq9js60n.com;
Nginx 的 HTTP/2 只能在 listen 443 ssl http2 模式下工作,且依赖完整、可信的 TLS 链。常见错误包括:
600,属主为 nginx 运行用户)openssl s_client -connect 域名:443 -servername 域名 -showcerts 验证)以 中文.cn 为例(Punycode 为 xn--fiq228c.cn):
server {listen 443 ssl http2;server_name xn--fiq228c.cn;ssl_certificate /etc/letsencrypt/live/xn--fiq228c.cn/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/xn--fiq228c.cn/privkey.pem;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;root /var/www/chinese;index index.html;
}
注意:不要在 server_name 或证书中混用中文和 Punycode;浏览器访问 https://中文.cn 时,会自动用 Punycode 发起 SNI 请求,Nginx 依靠该值匹配 server 块并提供对应证书。
部署后,在 Chrome DevTools 的 Network 标签页查看响应头,确认有 h2 协议标识;或用命令行:
curl -I --http2 https://xn--fiq228c.cn# 应返回 HTTP/2 200,而非 HTTP/1.1
若仍为 HTTP/1.1,请优先检查证书路径、权限、SNI 匹配和 OpenSSL 版本(需 ≥1.0.2,推荐 ≥1.1.1)。