能,只需在caddyfile中使用:80 { ... }而非域名配置,禁用tls指令与automatic_https,并将server_name设为:80,同时清理hsts缓存及caddy_data卷中旧证书即可实现纯http模式。

FrankenPHP 能不能关掉自动HTTPS只留HTTP
能,但不是“关掉自动HTTPS”,而是让 Caddy 不监听 443 端口、不触发 ACME 流程——FrankenPHP 本身没有独立的 HTTPS 开关,它的 HTTPS 行为完全由底层 Caddy 的配置驱动。
Caddyfile 中如何禁用 HTTPS 和自动证书
关键点:Caddy 默认只要配置了域名(如 example.com),就会尝试走 HTTPS;要纯 HTTP,必须显式避开 TLS 处理路径。
- 把监听目标改成
:80或具体 IP+端口,而不是域名 —— 例如写成:80{ ... },而非example.com{ ... } - 删掉或注释掉所有涉及 TLS、
tls指令、https://重定向逻辑的配置行 - 确保没启用
automatic_https全局选项(FrankenPHP 默认继承 Caddy 行为,而 Caddy 2.8+ 默认开启该特性) - 如果用了
SERVER_NAME=your-domain.com环境变量(常见于 Docker 部署),需改为SERVER_NAME=:80,否则 FrankenPHP 会仍按域名解析并触发 HTTPS 流程
为什么改了 Caddyfile 还跳 HTTPS?常见陷阱
浏览器 HSTS 缓存是最常被忽略的原因。一旦域名被 Let's Encrypt 签发过证书,Caddy 成功返回过 HSTS 响应头(Strict-Transport-Security),Chrome/Edge/Safari 就会强制后续所有请求走 HTTPS,且不发 HTTP 请求——此时改服务端毫无作用。
- 检查是否已触发过一次 HTTPS 访问:访问
chrome://net-internals/#hsts→ Query 输入域名,若返回结果,说明本地浏览器已记住 HSTS 策略 - 临时解决:在 Query 结果页点 Delete,再清空浏览器缓存(Ctrl+Shift+Delete),重启浏览器
- 根治办法:部署初期就用
:80启动,避免任何一次成功 HTTPS 响应;或在首次 HTTPS 响应前,手动在 Caddyfile 中禁用 HSTS:header Strict-Transport-Security "" - Docker 用户注意:
caddy_data卷里可能残留旧证书,删掉卷或清空/data/caddy/certificates目录可防止复用
HTTP-only 模式下 FrankenPHP 还支持 HTTP/3 吗
不支持。HTTP/3 依赖 QUIC,而 QUIC 必须运行在 TLS 1.3 之上。Caddy 的 experimental_http3 只对启用了 TLS 的 server 块生效;纯 HTTP(:80)块即使写了该配置也静默忽略。
如果你需要 HTTP/3,就必须走 HTTPS;如果坚持只用 HTTP,那只能用 HTTP/1.1 或 HTTP/2(后者在非 TLS 下 Caddy 不启用,因 RFC 明确要求 HTTP/2 over TLS)。
真正需要纯 HTTP 的场景极少——开发联调、内网测试、某些 IoT 设备受限环境。这种情况下,别碰域名、别配证书、别触发 HSTS,:80 + php_server 就够用,其余都是干扰项。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











