如何用Nginx将含特殊字符域名的HTTPS请求重定向至已获证域名?
解决Nginx中IDN域名HTTPS重定向的证书错误问题
问题根源
当用户访问https://flåtinfo.dk时,浏览器会自动将带特殊字符的IDN域名转换为Punycode格式(xn--fltinfo-0za.dk)发起请求。此时Nginx使用flaatinfo.dk的证书完成SSL握手,证书域名与请求域名不匹配,浏览器会优先抛出证书错误,之后才会执行重定向,导致用户体验极差。
方案一:为IDN域名申请匹配的SSL证书(推荐)
绝大多数主流证书服务商支持IDN域名,只需使用Punycode格式的域名申请即可:
- 将
flåtinfo.dk转换为Punycode:xn--fltinfo-0za.dk,www.flåtinfo.dk对应www.xn--fltinfo-0za.dk - 用该Punycode域名向服务商申请SSL证书
- 在Nginx中添加以下服务器块:
server { listen 443 ssl; server_name xn--fltinfo-0za.dk www.xn--fltinfo-0za.dk; # 配置IDN域名的证书路径 ssl_certificate /path/to/xn--fltinfo-0za.crt; ssl_certificate_key /path/to/xn--fltinfo-0za.key; # 永久重定向到目标域名 return 301 https://flaatinfo.dk$request_uri; }
这种方式下,SSL握手阶段证书与域名完全匹配,浏览器不会报错,直接完成重定向,是最优解。
方案二:无对应证书时的临时重定向配置(体验较差)
如果暂时无法申请IDN域名的证书,可通过Punycode配置让重定向生效,但用户仍会看到证书错误:
- 同样使用Punycode格式的域名配置server_name
- 复用
flaatinfo.dk的证书配置重定向:
server { listen 443 ssl; server_name xn--fltinfo-0za.dk www.xn--fltinfo-0za.dk; ssl_certificate /path/to/flaatinfo.crt; ssl_certificate_key /path/to/flaatinfo.key; return 301 https://flaatinfo.dk$request_uri; }
注意:此方案中浏览器仍会触发证书错误,用户需手动确认才能进入重定向,仅适合临时过渡使用。
补充说明
Nginx内部以ASCII格式处理域名,因此配置带特殊字符的IDN域名时,必须使用Punycode格式的域名作为server_name,否则无法正确匹配用户请求。
内容的提问来源于stack exchange,提问作者xjimdim
相关产品推荐
相关产品推荐

