FrankenPHP 1.9 默认支持 HTTP/2,依赖 Caddy 2.8+ 自动启用,仅在有效 HTTPS 下生效,无需配置且不可禁用;本地自动签发证书,生产需可信 TLS 证书;验证需通过浏览器 Network 标签或 curl --http2 测试。

FrankenPHP 1.9 默认就支持 HTTP/2,无需额外配置
FrankenPHP 1.9 基于 Caddy 2.8+,而 Caddy 自 2.0 起已默认启用 HTTP/2(且强制要求 TLS),只要走 HTTPS 就自动协商 h2。你不需要在 Caddyfile 里写 http2 或任何协议开关——它没有这个配置项,也不提供禁用选项。
必须用 HTTPS,否则 HTTP/2 不生效
FrankenPHP 和所有主流浏览器一样,只在加密连接上启用 HTTP/2。HTTP/1.1 明文请求(http://)永远无法触发 h2,即使你手动改端口或加 header 也没用。
- 本地开发时,Caddy 会自动签发本地证书并启用 HTTPS(访问
https://localhost:443或https://localhost:8080,取决于监听配置) - 生产环境必须配置有效域名 + 公开可信证书(如 Let's Encrypt),否则 ALPN 协商失败,回退到 HTTP/1.1
- 检查方式:浏览器开发者工具 Network 标签页 → 刷新页面 → 看任意请求的
Protocol列是否显示h2
验证 HTTP/2 是否真在跑
别只信文档,实测最可靠。FrankenPHP 的 HTTP/2 行为完全由底层 Caddy 控制,所以验证方法和标准 Caddy 一致:
- 命令行:
curl -I --http2 -k https://localhost:8080(-k跳过本地证书校验),响应头首行应为HTTP/2 200 - 看 Caddy 日志:启动时若输出
autosaved config或enabling automatic HTTPS,说明 TLS 已就绪,h2 可用 - 注意:
curl --http2-only会失败(因未 fallback),而--http2是安全的测试方式
常见误操作:试图在 Caddyfile 里“开启” HTTP/2
FrankenPHP 的 Caddyfile 不接受 protocols h2 http/1.1(Apache 风格)或 listen 443 ssl http2(Nginx 风格)。这些语法在 Caddy 中非法,会导致启动失败或静默忽略。
立即学习“PHP免费学习笔记(深入)”;
- 正确写法只有:
https://example.com或localhost:8080(Caddy 自动推断协议) - 错误写法示例:
protocols h2、http2 on、tls { protocols h2 }—— 全部无效 - FrankenPHP 的 PHP 运行时本身不参与协议协商,
$_SERVER['SERVER_PROTOCOL']始终是HTTP/1.1(这是 FastCGI 层的抽象限制,不影响真实网络协议)
真正要盯住的只有两件事:证书是否有效、客户端是否走 HTTPS。其余全是 Caddy 默默搞定的——这也是 FrankenPHP 简化部署的核心逻辑。一旦 HTTPS 握手成功,HTTP/2 就已在路上。



















