alt-svc 响应头是浏览器启用 http/3 的唯一途径,必须显式配置在 server 或 location 块中,语法严格(如 add_header alt-svc 'h3=":443"; ma=86400'),且需覆盖所有资源响应,否则无法触发 quic 连接。

Alt-Svc 响应头是浏览器发现并启用 HTTP/3 的唯一方式,没有它,Chrome、Edge、Firefox 等主流浏览器根本不会尝试发起 QUIC 连接——哪怕 Nginx 已完整支持 HTTP/3 也无济于事。
Alt-Svc 必须加在 server 或 location 块里
它不能只写在全局 http 块,也不能只靠 upstream 或 proxy_pass 透传。必须显式出现在处理客户端请求的 server 或具体 location 中,否则响应里压根不带这个头。
- 主站域名访问(如 https://example.com/)需在对应 server 块中配置
- 若存在子路径接口(如 /api/v1/),且希望这些请求也走 HTTP/3,就得在对应的 location 块里重复 add_header Alt-Svc
- 多个 server 块共用同一证书时,每个需要 HTTP/3 的 server 都得单独加
Alt-Svc 的语法和端口必须严格匹配
浏览器只认格式正确、端口一致的 Alt-Svc 值。写错一个字符或端口不一致,整个头就会被忽略。
- 标准写法:add_header Alt-Svc 'h3=":443"; ma=86400';
- 冒号前不能有空格,引号内端口必须与 listen quic 的端口完全一致(比如监听 443 quic,就不能写成 h3=":8443")
- ma(max-age)建议设为 86400(1 天)或 2592000(30 天),太小会导致频繁重新协商
- 可选兼容旧草案:h3-29=":443"; ma=2592000,但非必需
确保它出现在所有关键响应中
Alt-Svc 不仅要发给 HTML 页面,还要覆盖 JS、CSS、图片、API 等静态和动态资源,否则部分请求仍会降级到 HTTP/2。
- 推荐统一放在 server 块顶层,避免遗漏
- 如果用了反向代理(proxy_pass),确认后端没覆盖或清空该 header;必要时加 proxy_hide_header Alt-Svc; 防止后端干扰
- 用 curl -I https://example.com 或浏览器 Network 标签页检查响应头,确认 Alt-Svc 出现在每个关键请求里
验证是否生效
Alt-Svc 生效后,浏览器会在后续请求中主动发起 UDP 443 上的 QUIC 连接,但不会立刻切换——它需要先收到 Alt-Svc,缓存后再复用。
- 刷新页面后打开开发者工具 → Network → 点开任意请求 → 查看 Protocol 列是否显示 h3
- 响应头中 Alt-Svc 字段应清晰可见,且值与配置一致
- 用 curl -v --http3 https://example.com(需支持 HTTP/3 的 curl)可直接测试连接











