frankenphp 通过内置 caddy 统一处理 url 重写,配置集中于项目根目录的 caddyfile,需按序书写、区分大小写;典型规则包括前端控制器转发、静态资源分离(file_server 必须置于 php_fastcgi 前)、隐藏 .php 扩展等,调试需验证语法、关注顺序与路径细节。

FrankenPHP 内置 Caddy,URL 重写直接通过 Caddyfile 配置,无需 .htaccess 或 router.php。它把 PHP 运行时和 Web 服务器深度集成,重写规则在 Caddy 层统一处理,再交由 PHP 脚本执行,逻辑清晰、性能更高。
核心配置位置:Caddyfile
FrankenPHP 启动时默认读取项目根目录下的 Caddyfile(无扩展名)。所有重写、重定向、静态资源处理都写在这里。
- 规则按顺序执行,前面的匹配会优先生效
- 不支持分布式 .htaccess,所有配置必须集中管理
- 路径匹配区分大小写,建议统一用小写规则
常用重写场景与写法
FrankenPHP 的典型用途是现代 PHP 应用(如 Laravel、Symfony),常需将所有非静态请求转发到 index.php,同时保留查询参数:
- 基础前端控制器模式(推荐):
php_fastcgi localhost:2015
try_files {path} {path}/ /index.php?{query} - 更精确的排除判断(避免误转静态资源):
rewrite * {
to {path} {path}/ /index.php?{query}
}
配合 file_server 自动服务 CSS/JS/图片等文件 - 隐藏 .php 扩展名:
redir (.*)\.php$ {1} 301
rewrite * {
if {path}.php exists
to {path}.php
}
静态资源与 PHP 请求分离
FrankenPHP 默认不会自动识别静态文件,必须显式声明。否则所有请求(包括 /css/app.css)都会被转发给 PHP,导致 404 或错误响应:
- 在 Caddyfile 中添加 file_server 指令,并放在 php_fastcgi 之前:
file_server
php_fastcgi localhost:2015 - 确保 public/ 或 statics/ 目录存在且路径可访问
- 若静态资源放在子目录(如 /assets/),可用 file_server /assets/* 限定范围
调试与验证技巧
配置后不生效?常见原因不是规则写错,而是顺序或路径细节问题:
- 运行 caddy validate --config Caddyfile 检查语法
- 启动时加 -watch 参数实时监听变更:frankenphp run -watch
- 查看日志:FrankenPHP 默认输出访问日志到终端,关注 404 或 500 行为
- 测试时用 curl 加 -v 看真实响应头和重定向链
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











