FrankenPHP不支持Nginx的try_files指令,伪静态需通过.frankenphp.yaml定义路由规则,将非静态请求交由index.php处理,并配合WordPress固定链接设置生效。

FrankenPHP 不支持传统 Nginx 的 try_files 指令,也不能直接复用 Nginx 配置里的 location / 块——它用的是 PHP SAPI 内置的 HTTP 服务器,规则必须通过 .frankenphp.yaml 或路由注解定义。
FrankenPHP 的伪静态本质是 PHP 路由转发,不是服务器重写
FrankenPHP 启动时会读取根目录下的 .frankenphp.yaml(或 frankenphp.yaml),把所有非静态资源请求统一交给 index.php 处理。它不解析 Nginx 风格的 location,也不执行 rewrite 指令。
- 没有
mod_rewrite,也没有try_files,if (-f $request_filename)这类判断完全无效 - 所有请求先被 FrankenPHP 的内置路由器接收,再根据 YAML 规则决定是否代理给 PHP
- WordPress 的
index.php必须能接收到原始请求路径(如/hello-world/),否则WP_Rewrite无法匹配 - 静态文件(
.css、.js、/wp-admin/*.php)需显式放行,否则全被转给index.php导致 500 或白屏
必须配置 .frankenphp.yaml 才能启用伪静态
在 WordPress 根目录新建 .frankenphp.yaml,内容如下:
apps:
wordpress:
# 把所有非静态请求交给 index.php
router:
- match: "Path(`/`)"
# 排除已知静态后缀和 wp-admin/wp-includes 目录
exclude: [".*\.(?:css|js|png|jpg|jpeg|gif|ico|svg|woff2?|ttf|eot|xml|txt)$", "^/wp-admin/.*$", "^/wp-includes/.*$"]
to: "/index.php"
# 显式允许 wp-admin 下的 PHP 脚本直通(否则会被当成普通路由)
php:
- match: "^/wp-admin/.*\.php$"
- match: "^/wp-includes/.*\.php$"
- match: "^/wp-content/.*\.php$"-
exclude是关键:没它,/style.css也会进index.php,返回 HTML 而不是 CSS - 三个
php条目确保后台功能(如/wp-admin/admin-ajax.php)能正常执行,不被路由劫持 - 不要加
rewrite或redirect,FrankenPHP 当前版本不支持这些动作 - 文件名必须是
.frankenphp.yaml(点开头),且权限为 644
WordPress 后台固定链接设置必须配合生效
仅配 YAML 不够,index.php 收到请求后仍要靠 WordPress 自身的重写逻辑解析 URL —— 这依赖数据库里 permalink_structure 的值。
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
立即学习“PHP免费学习笔记(深入)”;
- 登录后台 → 设置 → 固定链接 → 选“文章名”或自定义结构(如
/%postname%/)→ 点“保存更改” - 这步会往数据库
wp_options表写入permalink_structure,否则WP_Rewrite不启动 - 如果之前用过“朴素”,改完后务必刷新一次,否则旧缓存可能让
$_SERVER['REQUEST_URI']仍是/index.php?p=123 - 验证方法:访问一个文章页(如
/hello-world/),看是否 200;再直接请求/wp-content/themes/twentytwentyfour/style.css,确认返回 CSS 内容而非 HTML
常见 404 或 500 场景及定位方式
FrankenPHP 下伪静态失败,90% 是因为请求没正确抵达 index.php,或抵达了但 WordPress 没识别出路径。
- 访问
/hello-world/返回 404:检查.frankenphp.yaml是否在根目录、文件名是否带点、YAML 缩进是否空格(不能用 tab) - 访问
/wp-admin/白屏或报错:确认php区块已包含^/wp-admin/.*\.php$,且没被其他规则覆盖 - 后台 AJAX 失败(如更新文章无反应):检查浏览器开发者工具 Network 标签页,看
admin-ajax.php请求是否返回 200 和 JSON,否则是php规则漏配 - 中文标签页(
/tag/中文/)404:FrankenPHP 默认对 URI 解码比 Nginx 更严格,确保 WordPress 已启用mbstring扩展,且数据库字符集为utf8mb4
FrankenPHP 的伪静态配置粒度很细,但容错率低——少一条 exclude 就可能让整个站点样式崩掉,多一条 php 规则又可能暴露敏感文件。别抄网上的 Nginx 片段,必须按它的 YAML 路由模型重写逻辑。


















