Nginx 1.26环境下HTTP3与HTTP2能否共存的配置问题咨询
你遇到的这个情况完全可以解决——HTTP3和HTTP2是能够共存的,完全可以让HTTP3作为优先协议,HTTP2(甚至HTTP/1.1)作为降级 fallback,问题出在你配置里的几个细节上,我来帮你逐一修正:
1. 修正Alt-Svc头的格式错误
你当前配置里的Alt-Svc用了HTML实体"来转义引号,但Nginx配置里应该用**反斜杠\**来转义双引号,否则浏览器收到的头内容会是h3=":443"; ma=86400,这不符合HTTP规范,浏览器无法正确识别,自然不会尝试切换到HTTP3。
把这行改成:
add_header Alt-Svc 'h3=":443"; ma=86400';
或者用双引号包裹整个字符串,内部转义:
add_header Alt-Svc "h3=\"\:443\"; ma=86400";
2. 优化listen指令的写法
建议把http2的配置直接合并到SSL的listen指令里,同时给QUIC的listen加上reuseport参数(提升QUIC的连接性能,Nginx 1.11.5+支持),调整后的server块监听配置应该是这样:
# HTTP3/QUIC 监听 listen 443 quic reuseport; listen [::]:443 quic reuseport; # HTTP2 + HTTPS 监听 listen 443 ssl http2; listen [::]:443 ssl http2; # 正确的Alt-Svc头 add_header Alt-Svc 'h3=":443"; ma=86400';
3. 验证配置并重启Nginx
修改完配置后,先执行配置检查确保没有语法错误:
nginx -t
如果输出test is successful,就可以重启Nginx生效:
systemctl restart nginx
4. 清除浏览器缓存后测试
因为浏览器会缓存Alt-Svc头的信息,之前错误的头可能还在缓存里,所以需要清除浏览器的缓存(或者打开隐私窗口测试),之后再打开开发者工具的Network面板,就能看到部分请求会用HTTP3,当HTTP3无法协商时(比如中间件拦截、老浏览器),会自动 fallback到HTTP2甚至HTTP/1.1。
为什么之前关闭HTTP2就能用HTTP3?
当你关闭HTTP2后,浏览器没有更优的HTTP/2协议可选,即使Alt-Svc头格式有问题,浏览器可能会尝试QUIC协议;但当HTTP2开启时,浏览器会优先使用已支持的HTTP2,加上错误的Alt-Svc无法触发HTTP3的切换,所以所有请求都走HTTP2了。
备注:内容来源于stack exchange,提问作者Bob Osola

