FrankenPHP 1.2 默认支持HTTPS,内置Caddy与ACME客户端,自动申请、部署并续期Let’s Encrypt证书;只需域名可解析、80/443端口开放且Caddyfile正确配置域名,无需手动管理证书文件。

FrankenPHP 1.2 默认就支持 HTTPS,不用手动加载证书
FrankenPHP 1.2 内置 Caddy 服务器内核,自带 ACME 客户端,只要域名可公网访问且 80/443 端口开放,它就能自动申请、部署并续期 Let’s Encrypt 证书。你不需要像 Nginx 那样手动指定 ssl_certificate 或管理 fullchain.pem 路径——这些全由 Caddy 后台完成。
关键前提是:Caddyfile 中的域名必须能被 Let’s Encrypt 的 ACME 服务验证。常见失败点包括:
- 域名 DNS 未解析到当前服务器 IP
- 防火墙或云厂商安全组屏蔽了 80 端口(ACME HTTP-01 挑战必需)
- 本地开发用
localhost或内网地址,无法走 Let’s Encrypt(此时需换 mkcert)
Caddyfile 配置只需声明域名,HTTPS 自动启用
FrankenPHP 1.2 默认读取当前目录的 Caddyfile。最简可用配置就是:
example.com {
php_server
}
只要 example.com 已正确解析且 80/443 可达,FrankenPHP 启动后会自动:
立即学习“PHP免费学习笔记(深入)”;
- 监听 80 端口响应 ACME 挑战
- 向 Let’s Encrypt 申请证书
- 监听 443 端口并启用 TLS 1.2/1.3
- 90 天自动续期(无需 cron)
注意:php_server 指令已隐式启用 HTTPS;不要加 tls internal 或手动写 tls /path/to/cert,那会覆盖自动流程。
本地开发要用 https://localhost?得换 mkcert
Let’s Encrypt 不签发 localhost 或 127.0.0.1,所以 FrankenPHP 在本地启动时若用 localhost 域名,会 fallback 到 HTTP-only 模式,浏览器报“不安全”。解决方法是用 mkcert 生成并信任本地证书:
- 运行
mkcert -install(一次,把根证书加入系统信任库) - 执行
mkcert localhost 127.0.0.1 ::1,生成localhost+2.pem和localhost+2-key.pem - 在
Caddyfile中显式指定证书路径:
localhost {
tls ./localhost+2.pem ./localhost+2-key.pem
php_server
}
重启 FrankenPHP 后,https://localhost 就能显示锁图标,且不会被浏览器拦截 API(如 navigator.mediaDevices.getUserMedia)。
PHP 代码里怎么判断当前是 HTTPS?直接看 $_SERVER['HTTPS']
FrankenPHP 1.2 会自动设置 $_SERVER['HTTPS'] === 'on'(不是 '1' 或 true),无需像 Nginx 那样手写 fastcgi_param HTTPS on。验证方式很简单:
<?php var_dump($_SERVER['HTTPS']); ?>
输出应为 string(2) "on"。如果仍是空字符串,说明:
- Caddyfile 域名没匹配上请求 Host(比如配了
example.com却用 IP 访问) - 用了反向代理但没透传
X-Forwarded-Proto: https(FrankenPHP 本身不经过代理,此情况少见) - 证书申请失败后降级到了 HTTP 模式(查日志:FrankenPHP 启动时会打印 ACME 状态)
混合内容、重定向打转、setcookie(..., true) 不生效等问题,八成源于这个值没设对——它比证书是否安装成功更关键。



















