<p>FrankenPHP 1.4 不处理 URL 重写,须由 Nginx 或 Caddy 承担:Nginx 用 try_files $uri $uri/ /index.php?$query_string,Caddy 用 rewrite * {path} {path}/ /index.php?{query},并确保 root 指向 public/、静态规则前置、php.ini 中 cgi.fix_pathinfo=1。</p>

FrankenPHP 1.4 本身不直接处理 URL 重写,它依赖底层 Web 服务器(Nginx 或 Caddy)完成路由分发。重写规则必须写在 Nginx 配置或 Caddyfile 中,而不是 PHP 层或 frankenphp.yaml 里。
Nginx 环境下配置 try_files 重写
适用于 Nginx + FrankenPHP 的典型部署(如 Docker 或系统服务):
location / {
try_files $uri $uri/ /index.php?$query_string;
}-
$uri/不能省略,否则目录访问(如/admin/)会 404 -
?$query_string必须保留,否则 GET 参数(如?page=2)丢失 - 此规则需放在
location ~ \.(js|css|png|...)$等静态资源规则之前,否则静态文件可能被错误转发给 PHP
Caddy 环境下配置 rewrite(推荐用于 FrankenPHP 原生集成)
Caddyfile 中应使用 rewrite 指令,而非 .htaccess 风格规则:
localhost:8080 {
root * /path/to/public
php_server
# 将所有非静态请求重写到 index.php,保留 PATH_INFO 和 QUERY_STRING
@notStatic {
not file
not {path}.php
}
rewrite @notStatic /index.php?{query}&{path}
# 或更简洁的等效写法(FrankenPHP 官方常用)
rewrite * {path} {path}/ /index.php?{query}
}-
{path}和{query}是 Caddy 内置变量,自动提取原始路径和查询参数 -
@notStatic条件可避免重复重写已匹配的静态资源 - 若项目用 PATH_INFO(如 WordPress、ThinkPHP),确保
php.ini中cgi.fix_pathinfo = 1
验证重写是否生效
在 public/index.php 开头临时加:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
立即学习“PHP免费学习笔记(深入)”;
<?php
header('X-Rewrite-Test: ok');
die('rewritten');访问任意子路径(如 /test/hello),若响应头含 X-Rewrite-Test: ok 且内容为 rewritten,说明重写已生效;否则问题出在 Web 服务器配置或 root 路径设置错误。
注意事项
- FrankenPHP 的
frankenphp.yaml不处理重写逻辑,它只控制 PHP 生命周期(如 worker 模式、eventsource) - 不要尝试在 PHP 中用
header()或输出缓冲模拟重写——这无法改变请求进入点 - WordPress、Laravel、ThinkPHP 等框架依赖此重写机制支持「漂亮链接」,配置错误将导致所有路由 404
不复杂但容易忽略


















