一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 中 HTTP/2 如何处理国际化中文域名的 punycode 证书配置

时间:2026-08-31 09:28:48 编辑:袖梨 来源:一聚教程网

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)。你必须:

  1. 将中文域名(如 评估侠.com)用在线工具(如 https://www.php.cn/link/cd930873f6112e4a49ed6c3704c0350c)转为 Punycode(xn--tpq9js60n.com
  2. 用该 Punycode 域名申请证书:certbot --nginx -d xn--tpq9js60n.com
  3. 确保 Nginx 配置中 server_name 与证书 SAN 完全一致,即写成:

    server_name xn--tpq9js60n.com;

HTTP/2 启用前提:TLS 必须启用且配置正确

Nginx 的 HTTP/2 只能在 listen 443 ssl http2 模式下工作,且依赖完整、可信的 TLS 链。常见错误包括:

  1. 证书私钥权限不对(应为 600,属主为 nginx 运行用户)
  2. 证书链不完整(缺少中间证书,可用 openssl s_client -connect 域名:443 -servername 域名 -showcerts 验证)
  3. server_name 写了中文却没配对应证书,导致 SNI 匹配失败,降级到 HTTP/1.1

完整可运行配置示例

中文.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 块并提供对应证书。

验证是否真正启用 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)。

热门栏目