frankenphp 的 documentroot 必须指向 public/ 目录,而非项目根目录;caddyfile 中需正确配置 root * /var/www/myapp/public,且 public/ 下需存在 index.php 等文件并具备可读权限。

是,大概率是 FrankenPHP 的 DocumentRoot 没指对 public/ 目录,而不是 Symfony 项目根目录。
FrankenPHP 要求 DocumentRoot 必须是 public/
FrankenPHP(基于 Caddy 的 PHP 运行时)和 Laravel/Symfony 等现代 PHP 框架一样,强制要求 Web 服务器的根目录为 public/。如果错误地把 DocumentRoot 设为项目根目录(如 /var/www/myapp),那么:
-
/static/css/app.css这类请求会去查/var/www/myapp/static/css/app.css—— 该路径根本不存在 -
/index.php会被当作普通文件尝试读取,而不是作为入口执行(可能返回 404 或直接下载源码) - Symfony 的静态资源(如
build/下的 CSS/JS、public/images/中的图片)全部无法命中
检查 FrankenPHP 配置中的 root 指令
FrankenPHP 使用 Caddyfile 配置,关键项是 root。必须确保它指向 public/ 子目录:
localhost {
root * /var/www/myapp/public
php_backend
}
常见错误写法:
-
root * /var/www/myapp→ 错,漏了/public -
root * /var/www/myapp/public/→ 错,末尾斜杠在 Caddy 中可能导致路径拼接异常(虽不总报错,但建议去掉) - 没写
root,依赖默认行为 → 错,FrankenPHP 不会自动降级查找public/
Symfony 自身的 public/ 目录结构是否完整
即使配置正确,也要确认 public/ 下真实存在你要访问的文件:
- 运行
ls -l /var/www/myapp/public/,看是否有index.php、build/、images/等目录或文件 - 若用 Encore 构建前端资源,确保已执行
yarn build或npm run build,输出落在public/build/ - 检查文件权限:
public/及其子目录需对 FrankenPHP worker 用户(通常是www-data或caddy)可读 - 注意大小写:Linux 下
Build/≠build/,模板中引用的路径必须完全一致
最易被忽略的一点:FrankenPHP 不读 .htaccess,也不支持 Apache 风格的 AllowOverride,所有路径逻辑全靠 Caddyfile 显式定义——配错一行 root,整个静态服务就失效,且不会报错提示,只会静默 404。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











