如何将ThinkPHP伪静态规则在FastPanel中改写为_ThinkPHPFastPanel伪静态?
- 内容介绍
- 文章标签
- 相关推荐
本文共计867个文字,预计阅读时间需要4分钟。
宝塔面板(非FastPanel)是当前主流的Linux服务器可视化管理系统,并非官方命名为FastPanel的同类产品;若你看到FastPanel,很大概率是误传、第三方改版命名,或混淆了FastAdmin(ThinkPHP+后台框架)与宝塔面板。所有ThinkPHP的伪静态配置,实际上都是在宝塔面板的网站设置 -> 伪静态中完成的。
宝塔里选 thinkphp 模板就完事?不一定
宝塔内置的 thinkphp 模板默认生成的是 PATHINFO 模式规则:if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; }。它适用于 ThinkPHP 5/6 默认开启 url_pathinfo 且未修改 URL_MODEL 的情况。但如果你用了以下任一场景,直接选模板会出问题:
- ThinkPHP 6+ 开启了
route_url_convert或自定义了url_domain_deploy - 项目部署在子目录(如
https://example.com/admin/),而规则没带子目录前缀 - 用了 Swoole 或 RoadRunner 等常驻进程模式,Nginx 仍按传统 PHP-FPM 规则转发
- FastAdmin 启用了插件路由(如
addon_url生成的/mydemo/test/myname.html),但规则没兼容.html后缀
这时必须手动替换为更健壮的 try_files 写法:
location / { try_files $uri $uri/ /index.php?s=$uri&$args; }
注意:这里用 $uri 而非 $request_uri,避免双问号;&$args 保证 GET 参数不丢失。
立即学习“PHP免费学习笔记(深入)”;
为什么访问还是 404?先查这三处
保存规则并重载 Nginx 后仍 404,不是规则写错了,而是请求根本没进 PHP 层。常见断点位置:
-
index.php文件权限不对(如 600),Nginx 用户无法读取 —— 改成644 - ThinkPHP 的
APP_DEBUG关了,但route_check没开,导致路由未注册 —— 检查config/route.php是否 return 了完整路由数组 - FastAdmin 后台「系统 → 系统参数 → URL 模式」设成了「兼容模式」,却配了 PATHINFO 规则 —— 必须统一为「重写模式」
快速验证:直接访问 https://yoursite.com/index.php?s=admin/index/login,如果能进后台,说明 PHP 和框架本身没问题,纯属伪静态转发失败。
FastAdmin 插件伪静态要额外加规则
FastAdmin 的插件(如 mydemo)通过 addon_url() 生成形如 /mydemo/test/myname.html 的地址,但宝塔默认规则只匹配 /index.php?s=xxx,对 .html 后缀不处理。需在原有 location 块内追加:
location ~ \.html$ { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } }
或者更稳妥地合并进主 location:
location / { try_files $uri $uri/ @rewrite; } location @rewrite { rewrite ^(.*)$ /index.php?s=$1 last; }
这样无论 /admin 还是 /mydemo/test.html 都会被捕获到 index.php,再由 ThinkPHP 路由解析。
真正容易被忽略的点是:FastAdmin 插件伪静态依赖 url_html_suffix 配置和 addon_url 函数调用方式,光配 Nginx 不改 PHP 层,规则再全也没用。务必确认插件 config.php 里 'url_html_suffix' => 'html' 已启用,且生成链接时用了 addon_url('mydemo/index/index') 而不是硬编码 URL。
本文共计867个文字,预计阅读时间需要4分钟。
宝塔面板(非FastPanel)是当前主流的Linux服务器可视化管理系统,并非官方命名为FastPanel的同类产品;若你看到FastPanel,很大概率是误传、第三方改版命名,或混淆了FastAdmin(ThinkPHP+后台框架)与宝塔面板。所有ThinkPHP的伪静态配置,实际上都是在宝塔面板的网站设置 -> 伪静态中完成的。
宝塔里选 thinkphp 模板就完事?不一定
宝塔内置的 thinkphp 模板默认生成的是 PATHINFO 模式规则:if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; }。它适用于 ThinkPHP 5/6 默认开启 url_pathinfo 且未修改 URL_MODEL 的情况。但如果你用了以下任一场景,直接选模板会出问题:
- ThinkPHP 6+ 开启了
route_url_convert或自定义了url_domain_deploy - 项目部署在子目录(如
https://example.com/admin/),而规则没带子目录前缀 - 用了 Swoole 或 RoadRunner 等常驻进程模式,Nginx 仍按传统 PHP-FPM 规则转发
- FastAdmin 启用了插件路由(如
addon_url生成的/mydemo/test/myname.html),但规则没兼容.html后缀
这时必须手动替换为更健壮的 try_files 写法:
location / { try_files $uri $uri/ /index.php?s=$uri&$args; }
注意:这里用 $uri 而非 $request_uri,避免双问号;&$args 保证 GET 参数不丢失。
立即学习“PHP免费学习笔记(深入)”;
为什么访问还是 404?先查这三处
保存规则并重载 Nginx 后仍 404,不是规则写错了,而是请求根本没进 PHP 层。常见断点位置:
-
index.php文件权限不对(如 600),Nginx 用户无法读取 —— 改成644 - ThinkPHP 的
APP_DEBUG关了,但route_check没开,导致路由未注册 —— 检查config/route.php是否 return 了完整路由数组 - FastAdmin 后台「系统 → 系统参数 → URL 模式」设成了「兼容模式」,却配了 PATHINFO 规则 —— 必须统一为「重写模式」
快速验证:直接访问 https://yoursite.com/index.php?s=admin/index/login,如果能进后台,说明 PHP 和框架本身没问题,纯属伪静态转发失败。
FastAdmin 插件伪静态要额外加规则
FastAdmin 的插件(如 mydemo)通过 addon_url() 生成形如 /mydemo/test/myname.html 的地址,但宝塔默认规则只匹配 /index.php?s=xxx,对 .html 后缀不处理。需在原有 location 块内追加:
location ~ \.html$ { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } }
或者更稳妥地合并进主 location:
location / { try_files $uri $uri/ @rewrite; } location @rewrite { rewrite ^(.*)$ /index.php?s=$1 last; }
这样无论 /admin 还是 /mydemo/test.html 都会被捕获到 index.php,再由 ThinkPHP 路由解析。
真正容易被忽略的点是:FastAdmin 插件伪静态依赖 url_html_suffix 配置和 addon_url 函数调用方式,光配 Nginx 不改 PHP 层,规则再全也没用。务必确认插件 config.php 里 'url_html_suffix' => 'html' 已启用,且生成链接时用了 addon_url('mydemo/index/index') 而不是硬编码 URL。

