FrankenPHP不读.htaccess文件,因其基于PHP SAPI直接运行,不依赖Apache;所有依赖.htaccess的功能(如SEO重定向、安全限制、缓存头)均失效,须迁移到Caddyfile或PHP层处理。

FrankenPHP 不读 .htaccess 文件
FrankenPHP 是基于 PHP 的 SAPI(Server API),直接运行 PHP 应用,不依赖 Apache,因此 .htaccess 文件完全被忽略。任何插件写死的重写规则、安全头、目录限制等,只要靠 .htaccess 生效,在 FrankenPHP 下都会失效——不是“没生效”,是压根不会被解析。
哪些插件的 .htaccess 行为会出问题
常见于以下几类插件:
- SEO 插件(如 All in One SEO、Yoast):自动生成
.htaccess重定向或强制 HTTPS 规则 - 安全插件(如 Wordfence、iThemes Security):写入 IP 拦截、禁止访问
/wp-admin/目录、禁用 PHP 执行等规则 - 缓存插件(如 WP Super Cache、LiteSpeed Cache):添加
Expires头、Cache-Control或静态资源重写
这些插件在 FrankenPHP 上仍能启用,但它们写进 .htaccess 的那部分功能等于“关机状态”。你得手动把逻辑迁移到 FrankenPHP 的配置层(即 Caddyfile 或 PHP 应用内处理)。
重写规则必须转成 Caddyfile 语法
FrankenPHP 通常搭配 Caddy 作为反向代理/前端服务器,所有 URL 重写、HTTPS 强制、静态文件处理都应在 Caddyfile 中声明。例如 WordPress 标准伪静态:
立即学习“PHP免费学习笔记(深入)”;
php_host localhost:8080
handle_path /wp-content/* {
file_server
}
handle_path /wp-includes/* {
file_server
}
handle_path /wp-admin/* {
reverse_proxy localhost:8080
}
handle {
try_files {path} {path}/ /index.php?{query}
reverse_proxy localhost:8080
}注意点:
-
try_files替代了 Apache 的RewriteCond+RewriteRule组合 - 不要漏掉
/wp-content/*和/wp-includes/*的file_server,否则附件、主题资源 404 - FrankenPHP 默认监听
localhost:8080,Caddy 的reverse_proxy必须指向这个地址 - 如果插件写了强制 www 或 HTTPS 重定向,需在 Caddyfile 顶层加:
redir https://{host}{uri} 301或redir https://www.{host}{uri} 301
安全类规则不能靠 .htaccess,得进 PHP 层或 Caddy
比如插件在 .htaccess 里写了禁止访问 .env、wp-config.php,这类规则在 FrankenPHP 下必须显式处理:
- Caddy 层:在
Caddyfile中加handle_path /.env { respond "Not found" 404 } - PHP 层:在
index.php开头加if (str_ends_with($_SERVER['REQUEST_URI'], '.env') || str_ends_with($_SERVER['REQUEST_URI'], 'wp-config.php')) { http_response_code(404); exit; } - FrankenPHP 自身支持
static_files配置,但不支持路径黑名单,所以别指望它自动过滤敏感文件
最易被忽略的是:插件可能通过 fopen('.htaccess', 'a') 尝试写入规则,这在 FrankenPHP 下不会报错,但写入后毫无作用,还会让运维误以为“规则已生效”。



















