不需要装wordpress https插件,frankenphp通过caddy自动完成https全流程,包括证书申请、tls配置和90天自动续期,wordpress只需正确配置url和wp-config.php中的https常量。

FrankenPHP 本身不提供 HTTPS 开关,自动 HTTPS 完全由底层 Caddy 驱动——只要配置合法域名、80/443 端口可达、DNS 解析正确,Caddy 就会在首次启动时静默申请 Let’s Encrypt 证书并启用 TLS 1.3。
确保 Caddyfile 使用域名而非端口监听
Caddy 的自动 HTTPS 只对带域名的 server 块生效。写成 :80 或 localhost 不会触发 ACME 流程。
- ✅ 正确:
example.com { php_server }或www.example.com example.com { php_server } - ❌ 错误:
:80 { php_server }(纯 HTTP 模式)、localhost { php_server }(本地无有效证书) - 域名必须能被公网解析,且 80 端口未被防火墙或 CDN 拦截(HTTP-01 挑战必需)
别禁用 automatic_https,也别手动配 tls
Caddy 2.8+ 默认开启 automatic_https,这是自动 HTTPS 的总开关。手动加 tls 指令反而会覆盖自动流程,导致证书无法续期或 ALPN 协商失败。
- ✅ 让它默认运行:Caddyfile 中不要出现
tls、automatic_https off、https://重定向等干扰项 - ❌ 避免混用:比如在
example.com块里写tls /path/to/cert.pem /path/to/key.pem,会跳过 ACME,失去自动续期能力 - 检查日志:
caddy log或journalctl -u caddy -f中看到acme: Obtained certificate表示成功
HTTP → HTTPS 跳转必须放在 :80 server 块里
自动 HTTPS 只管证书和加密,不负责跳转。跳转逻辑必须显式写在独立的 :80 监听块中,否则用户仍可直连 HTTP。
- ✅ 推荐写法:
:80 { respond "Moved permanently" 301 redir https://{host}{uri} 301 } - ⚠️ 注意:不能把
redir或return放在example.com块里——那块只监听 443,HTTP 请求根本进不去 - 如果用了 CDN(如 Cloudflare),务必关闭其 “Always Use HTTPS”,否则与 Caddy 跳转叠加引发
ERR_TOO_MANY_REDIRECTS
WordPress 或 Laravel 等应用要同步告诉 PHP 当前是 HTTPS
Caddy 终止 HTTPS 后,PHP 进程收到的是明文请求,默认不设 $_SERVER['HTTPS']。应用若没识别到 HTTPS,可能生成 HTTP 链接、拒绝登录 Cookie 或报混合内容警告。
- WordPress:在
wp-config.php加if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; } - Laravel:确保
APP_URL是https://开头,并在中间件或TrustProxies中设置$proxies = '*'; - 通用验证:访问
https://yoursite.com后,在 PHP 中打印$_SERVER['HTTPS']和$_SERVER['HTTP_X_FORWARDED_PROTO'],两者都应为on或https
最容易被忽略的是浏览器 HSTS 缓存——一旦域名成功签过证书,Chrome 就会强制所有后续请求走 HTTPS,哪怕你已删掉 Caddy 配置、清空证书目录,本地也看不到 HTTP 响应。调试时建议先用新域名或隐身窗口验证。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











