FrankenPHP 1.5 多站点无需不同端口,依靠Caddy server块按Host头匹配域名实现基于域名的虚拟主机;每个块需显式声明域名、独立配置root和php_server,共享自动HTTPS与统一日志。

FrankenPHP 1.5 实现多站点虚拟主机,核心不靠端口区分,而是依赖 Caddy 的 server 块按 Host 头路由——也就是标准的“基于域名的虚拟主机”。整个过程轻量、统一,且自动集成 HTTPS。
域名驱动的 server 块配置
Caddyfile 中为每个站点定义独立的 server 块,显式声明域名(支持 example.com、www.example.com 或通配符 *.example.com)。Caddy 会根据请求中的 Host 头自动匹配对应块,无需修改端口或 IP。
- 每个块必须写明完整域名,不能省略或留空
- 多个域名可共用一个块,用空格分隔:
example.com www.example.com - 通配符仅匹配子域,不匹配根域;如需两者都支持,需同时列出
各自独立的运行环境
每个 server 块内单独配置 root 和 php_server,确保代码、资源、PHP 运行时完全隔离。
-
root必须是绝对路径,指向项目public/目录(如/var/www/site-a/public) -
php_server指令只在当前块生效,不会影响其他站点 - 不同站点可用不同 PHP 版本或扩展配置(通过 FrankenPHP 的
php_version或自定义php.ini路径)
HTTPS 自动化与日志统一管理
所有站点共享 Caddy 的 ACME 流程,证书自动申请、续期,无需手动干预。日志也默认按域名归类,便于排查。
立即学习“PHP免费学习笔记(深入)”;
- 只要域名 DNS 解析正常,Caddy 启动后几秒内即可完成 HTTPS 初始化
- HTTP 请求会自动 301 重定向到 HTTPS(除非显式禁用)
- 访问日志和错误日志可通过
log指令分别配置路径,支持按站点拆分
避免常见配置陷阱
有些做法看似方便,实则破坏虚拟主机逻辑,需特别注意:
- 不要设置
SERVER_NAME=:8080类环境变量——这会让 Caddy 切入纯 HTTP 模式,关闭 Host 匹配 - 不要给每个站点分配不同端口(如 :8081、:8082)——这绕过域名路由,失去自动 TLS 和统一日志优势
- 不要共用
root目录或让多个server块指向同一 public 路径——会导致路由混乱和权限冲突



















