<p>FrankenPHP默认不自动猜路径,严格依赖Caddyfile中root指令;若无Caddyfile,则以当前工作目录为Web根,但Laravel必须配合root * public/才能正确服务静态资源和路由。</p>

FrankenPHP 二进制启动时默认找哪个目录
它不自动猜路径,而是严格依赖 Caddyfile 中的 root 指令。如果你没写 Caddyfile,FrankenPHP 会用内置默认行为:监听 :8080、把当前工作目录当作 Web 根,并尝试服务 index.php 和静态文件——但这对 Laravel 不适用,因为 Laravel 要求入口是 public/ 子目录。
Caddyfile 中必须显式写 root public/
在 Laravel 项目根目录(即含 composer.json 和 public/ 的目录)创建 Caddyfile,内容必须包含:
localhost {
root * public/
php_server {
try_files {path} /index.php
}
}关键点:
-
root * public/表示所有请求都以public/为文档根,public/index.php才会被当作 PHP 入口 - 不能写成
root public/(缺少*),否则 Caddy 无法正确匹配路径前缀 -
try_files {path} /index.php保证静态资源(如/js/app.js)被直接返回,不存在时才 fallback 到 Laravel 路由入口
想换别的目录?改 root 就行,但别动项目结构
比如你把 Laravel 的 public/ 重命名为 web/,那就把 Caddyfile 改成:
立即学习“PHP免费学习笔记(深入)”;
localhost {
root * web/
php_server {
try_files {path} /index.php
}
}注意:
-
root后面的路径是相对于当前工作目录的,不是相对于Caddyfile位置 - 启动命令必须在项目根目录执行:
./frankenphp,不能 cd 进public/再运行 - 如果站点目录不在当前目录下(比如在
/opt/myapp),就先cd /opt/myapp,再运行二进制
为什么不用 --root 参数或命令行选项
FrankenPHP 的独立二进制不提供 --root、--public-dir 这类命令行开关。所有路径控制都收口到 Caddyfile ——这是 Caddy 的设计哲学,也是 FrankenPHP 保持配置一致性的代价。
试图绕过 Caddyfile 直接指定目录,只会触发默认行为,导致 public/ 里的 CSS、JS 404,或者 Laravel 路由完全不生效。最常被忽略的是:Caddyfile 必须放在项目根目录,且 root 值必须和实际目录结构严格对应,差一个斜杠或大小写都会失败。



















