FrankenPHP v1.4 内置 Caddy v2.8.4,HTTP/3 非默认开启,必须显式配置 experimental_http3 且暴露 UDP 443 端口;仅映射 TCP 443 会导致 HTTP/3 静默失效,验证需 curl --http3、DevTools Protocol 列查 h3 及日志确认 http3: enabled。

FrankenPHP v1.4 内置 Caddy v2.8.4,HTTP/3 不是默认开启的协议,必须显式启用 experimental_http3 且确保 UDP 443 端口可达,否则浏览器和 curl 均无法协商到 h3。
确认容器已暴露 UDP 443 端口
启动容器时必须添加 【-p 443:443/udp】 映射,仅映射 TCP 443(-p 443:443)会导致 Caddy 监听 UDP 443 失败,HTTP/3 静默不可用。Docker 默认不透传 UDP 流量,漏掉这一步,后续所有配置都无效。
使用 host 网络模式时跳过此步,但需确保宿主机防火墙(如 ufw 或 firewalld)放行 udp/443,并在云厂商安全组中显式勾选 UDP 协议——很多控制台默认只开 TCP,这是 HTTP/3 在公网失效的最常见原因。
挂载自定义 Caddyfile 并启用 experimental_http3
方法一:在项目根目录创建 Caddyfile,内容至少包含三部分:
立即学习“PHP免费学习笔记(深入)”;
① 全局配置块开头写 { experimental_http3 };
② 域名监听块(不能是 :80 或 localhost),例如 example.com { php_server };
③ root 和 php_server 指令要完整,缺一不可。
方法二:若已有 Caddyfile,只需在最顶部大括号内插入 experimental_http3 ——注意不是放在某个 site 块里,也不是加在 tls 指令后,它必须是全局指令,且 Caddy v2.8.4 要求拼写完全匹配,大小写或空格错误都会导致忽略。
这一步操作起来很简单,直接把文件拖进去就行,但很多人误以为只要 Caddy 版本够新就自动开启,其实 v2.8.4 仍需手动声明。
验证 HTTP/3 是否生效
第一步:用 curl 测试,执行 curl -I --http3 https://example.com,返回状态码 200 且含 alt-svc: h3= 表示成功;
第二步:打开 Chrome DevTools → Network 标签页 → 刷新页面 → 查看任意请求的 Protocol 列,出现 h3 即为 HTTP/3 已启用;
第三步:检查容器内 Caddy 日志,启动时应输出 http3: enabled 字样,若无此日志,说明 experimental_http3 未被识别或 UDP 端口未就位。



















