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)。
证书必须用 Punycode 域名申请和配置
Let’s Encrypt 或其他 CA 不接受纯中文域名作为证书主体(Subject Alternative Name)。你必须:
- 将中文域名(如
评估侠.com)用在线工具(如 https://www.php.cn/link/cd930873f6112e4a49ed6c3704c0350c)转为 Punycode(xn--tpq9js60n.com) - 用该 Punycode 域名申请证书:
certbot --nginx -d xn--tpq9js60n.com - 确保 Nginx 配置中
server_name与证书 SAN 完全一致,即写成:
server_name xn--tpq9js60n.com;
HTTP/2 启用前提:TLS 必须启用且配置正确
Nginx 的 HTTP/2 只能在 listen 443 ssl http2 模式下工作,且依赖完整、可信的 TLS 链。常见错误包括:
- 证书私钥权限不对(应为
600,属主为 nginx 运行用户) - 证书链不完整(缺少中间证书,可用
openssl s_client -connect 域名:443 -servername 域名 -showcerts验证) - server_name 写了中文却没配对应证书,导致 SNI 匹配失败,降级到 HTTP/1.1
完整可运行配置示例
以 中文.cn 为例(Punycode 为 xn--fiq228c.cn):
server {
listen 443 ssl http2;
server_name xn--fiq228c.cn;
<pre class="brush:php;toolbar:false;">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 块并提供对应证书。
验证是否真正启用 HTTP/2
部署后,在 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)。


















