Route 53+Nginx配置HTTP转HTTPS及WWW转非WWW遇ERR_HTTP2_PROTOCOL_ERROR
问题排查与修复方案
核心问题分析
- $server_name变量误用:80端口重定向使用
$server_name会导致访问www.example.com时跳转到https://www.example.com,后续HTTPS请求若遇到HTTP/2兼容性问题或证书不匹配,就会触发ERR_HTTP2_PROTOCOL_ERROR。 - HTTP/2兼容性限制:部分浏览器对HTTP/2的配置要求更严格,SSL参数、头部设置不当会直接导致协议错误。
- 浏览器缓存残留:之前错误的301重定向会被浏览器持久缓存,导致非Firefox浏览器无法正常加载。
修复步骤
1. 修正Nginx重定向逻辑
将80端口的重定向目标改为固定的非WWW域名,确保所有HTTP流量统一跳转到https://example.com:
server { listen 80 default_server; listen [::]:80 default_server; server_name example.com www.example.com; # 直接指定跳转目标,避免$server_name带来的不确定性 return 301 https://example.com$request_uri; }
2. 拆分HTTPS服务器块(优化配置)
将非WWW和WWW的HTTPS请求分开处理,明确对WWW域名做301重定向,避免依赖Route53别名可能带来的解析延迟:
# 处理WWW域名的HTTPS请求,直接跳转到非WWW server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.example.com; include snippets/ssl-example.com.conf; include snippets/ssl-params.conf; return 301 https://example.com$request_uri; } # 处理非WWW域名的HTTPS请求 server { listen 443 ssl http2 default_server; listen [::]:443 ssl http2 default_server; server_name example.com; include snippets/ssl-example.com.conf; include snippets/ssl-params.conf; large_client_header_buffers 4 32k; root /var/www/mydomain; index index.php; }
3. 检查SSL证书与参数
- 确认
ssl-example.com.conf中的证书是包含example.com和www.example.com的SAN证书,单域名证书会导致HTTPS访问WWW时触发证书错误,进而引发HTTP/2协议问题。 - 优化
ssl-params.conf中的加密套件配置,保证兼容主流浏览器:
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off;
4. 清除浏览器缓存
- Chrome/Edge等浏览器:按
Ctrl+Shift+Delete清除“缓存的图片和文件”,再前往chrome://net-internals/#hsts删除对应域名的HSTS记录。 - 测试时优先使用隐私模式(Incognito/Private Window)绕过本地缓存,验证配置是否生效。
5. 验证Route53解析
使用命令行工具检查域名解析结果:
dig example.com A dig example.com AAAA dig www.example.com A dig www.example.com AAAA
确保WWW域名的A/AAAA记录正确指向非WWW域名的解析值,可临时将TTL改为300秒加快解析生效速度。
测试流程
- 重启Nginx服务:
sudo systemctl restart nginx - 用curl验证重定向逻辑:
curl -I http://example.com curl -I http://www.example.com curl -I https://www.example.com
确认所有请求最终都跳转到https://example.com,返回状态码为301或200。
3. 用不同浏览器的隐私模式访问网站,确认ERR_HTTP2_PROTOCOL_ERROR不再出现。
内容的提问来源于stack exchange,提问作者JoaMika
相关产品推荐
相关产品推荐

