frankenphp不读取.htaccess文件,因其非apache环境,无mod_rewrite和allowoverride机制;所有请求需由php层(如index.php)统一处理,须通过frankenphp.yaml配置documentroot与indexfile,并确保框架启用前端控制器模式。

.htaccess 规则在 FrankenPHP 里根本不起作用——它压根不读这个文件。
FrankenPHP 是基于 Swoole 或 PHP-FPM 的现代 PHP 运行时,不是 Apache,也不兼容 Apache 的模块机制(比如 mod_rewrite)和分布式配置逻辑。它没有 AllowOverride、不解析 .htaccess、也不会去扫描目录下有没有这个文件。
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
你如果把 Laravel/ThinkPHP 项目直接丢进 FrankenPHP 启动,却还指望 .htaccess 里的 RewriteRule 自动生效,那所有带参数的路由(比如 /user/123)都会 404。
FrankenPHP 怎么处理 URL 重写
FrankenPHP 把请求入口完全交由 PHP 层控制,等价于「所有请求都必须落到index.php」,但这个转发动作**得你自己在 PHP 里做**,或者靠 FrankenPHP 自带的路由配置。
- 它支持通过
frankenphp.yaml或命令行参数定义入口点(如index.php),并自动将非静态资源请求 fallback 到该入口 - 静态资源(
.css、.js、图片等)默认直出,无需 PHP 干预;其余路径一律交给index.php处理 - 没有
RewriteCond、RewriteBase这类概念,也不存在「排除真实文件」的自动判断逻辑
换句话说:FrankenPHP 不做 Apache 那套重写,它只做一件事——把不该直出的请求,转给你的 PHP 入口文件。
迁移时怎么替代 .htaccess 规则
你要做的不是“找.htaccess 的位置”,而是确认两点:
-
frankenphp.yaml中是否设置了正确的documentRoot和indexFile(例如public/index.php) - 项目框架是否已启用「前端控制器模式」,即所有路由由 PHP 自己解析(Laravel 默认开启,ThinkPHP 需确认
APP_URL和路由配置)
常见遗漏点:
- 忘记把
documentRoot指向public/目录,导致index.php不在 Web 可访问路径下 - 误以为 FrankenPHP 会自动识别
public/.htaccess,结果没配frankenphp.yaml,直接跑默认静态服务 - 在
index.php前加了 Nginx/Apache 风格的 PATH_INFO 修复代码(如$_SERVER['PATH_INFO'] = ...),但 FrankenPHP 已原生注入正确值,反而破坏路由
FrankenPHP 能不能模拟 Apache 的 RewriteCond 行为
不能,也不该尝试。- 它不提供
%{REQUEST_FILENAME}这类服务器变量,也没有文件系统层面的「是否存在」实时判断机制 - 如果你真需要按文件存在与否分流(比如优先返回
robots.txt或sitemap.xml),得在index.php开头手动file_exists()判断并readfile()输出 - 更推荐做法:把这类静态资源明确列在
frankenphp.yaml的static规则里,或用 CDN 托管
最易被忽略的一点:FrankenPHP 的日志默认不输出重定向链路或重写过程——你没法像 Apache 的 RewriteLog 那样调试规则是否匹配。所有路由逻辑必须在 PHP 层可验证、可打点。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










