caddyfile中域名必须与请求host头完全一致(如myapp.com),端口由frankenphp启动参数--addr指定(如--addr :8080),且docker需-p映射相同端口;不可在server块名中写端口(如myapp.com:8080是非法语法)。

域名和端口在Caddyfile里怎么配才生效
FrankenPHP 容器本身不直接“绑定域名”,它靠 Caddyfile 的 server 块匹配 Host 请求头来路由,而端口由容器启动时监听的网络地址决定。两者必须协同:Caddyfile 里的 localhost 或 example.com 必须和你实际访问的 URL 域名一致,且容器得监听对应端口(如 :80 或 :443)。
常见错误是写了个 myapp.local { ... },却用 http://localhost:8080 访问——Caddy 根本不会进这个块,因为 Host 头是 localhost,不是 myapp.local。
-
server块开头必须是真实请求中出现的 Host 值(支持通配符,如*.example.com) - 如果想用非标准端口(如
:8080),Caddyfile 中不能写myapp.com:8080,而应写myapp.com,再通过frankenphp run --addr :8080启动容器 - HTTP/HTTPS 自动跳转依赖 Caddy 默认行为:监听
:80和:443才能触发 ACME 证书申请;若只监听:8080,https://myapp.com:8080不会自动签发证书
容器启动时怎么指定监听端口
FrankenPHP 默认监听 :8080(HTTP)和 :443(HTTPS),但这个行为可被覆盖。Docker 环境下,端口映射(-p)和进程内监听(--addr)要分开看:前者是宿主机到容器的网络转发,后者是 FrankenPHP 进程自己 bind 哪个地址。
例如你希望用户通过 http://myapp.com:8080 访问,就得让 FrankenPHP 在容器内监听 :8080,而不是默认的 :8080 + :443 组合——否则 Caddyfile 里写的 myapp.com 块根本收不到请求。
- 启动命令加
--addr :8080:让 FrankenPHP 只监听 HTTP 的 8080 端口(禁用 HTTPS) - Docker
-p 8080:8080必须与--addr端口一致,否则请求进不来 - 若需 HTTPS,必须监听
:443(或--addr :443),且宿主机放行 443 端口;--addr :8443这种非标 HTTPS 端口无法触发 Let's Encrypt 自动签发 - 不要在 Caddyfile 中写
myapp.com:8080——Caddy 不支持端口作为 server 名的一部分(这是语法错误)
多域名共用一个端口怎么避免冲突
同一个端口(比如 :80)上跑多个域名,完全可行,前提是每个域名有独立的 server 块,且 root 路径不重叠。FrankenPHP 不会“按目录隔离”,而是严格按 Host 头分发请求到对应块,所以配置错一个 root,就可能让 A 域名的请求加载了 B 域名的 index.php。
典型错误是把两个 server 块写成嵌套或漏掉 root,导致 fallback 到默认路径。
- 每个
server块必须以域名(或 IP+端口)开头,例如site-a.com { ... }和site-b.com { ... } - 每个块内必须显式声明
root * /app/site-a/public,不能省略或复用上一个块的值 - 若用
php_server,它只对当前server块内匹配的路径生效;跨块不会穿透 - HTTPS 自动申请时,所有域名必须 DNS 解析生效,否则 ACME 挑战失败,整个 Caddy 启动卡住
为什么改了 Caddyfile 域名但访问还是 404
最常被忽略的是:Caddyfile 修改后,FrankenPHP 不会自动 reload。它不像 Nginx 那样支持 nginx -s reload,每次改完都得重启进程,否则旧配置一直生效。
另一个隐蔽问题是 Caddy 的缓存行为:如果你之前用 localhost 启动过,Caddy 可能已生成一份 /data/caddy/certificates 下的本地证书,之后换域名但没清数据,会导致 TLS 握手失败或 404(尤其在浏览器缓存了 HSTS 策略时)。
- 改完 Caddyfile 后,必须
kill当前 FrankenPHP 进程,再重新运行frankenphp run - Docker 场景下,用
docker restart或重建容器,别只docker cp新 Caddyfile 就以为生效了 - 调试阶段建议加
--debug参数启动,能看到 Caddy 加载了哪些 server 块、匹配了哪个 Host - 第一次部署新域名时,删掉
/data/caddy目录(或挂载卷)再启动,避免证书残留干扰
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











