thinkphp6多应用模式下nginx伪静态需专用规则:清空宝塔默认tp5规则,粘贴支持应用前缀的if重写规则,运行目录设为/public,php禁用函数中移除putenv和ini_set,并确保php配置含path_info支持。

ThinkPHP6多应用模式下,Nginx伪静态不能直接套用单应用规则,否则所有子应用(如 /admin、/api)都会 404。根本原因是:TP6 多应用靠 URL 路径第一段识别应用名,而默认规则把请求全扔给 /index.php?s=$1,Nginx 在没找到真实文件时直接返回 404,框架根本没机会启动。
必须删除宝塔默认的 ThinkPHP 规则
宝塔下拉菜单里的“ThinkPHP”模板是为 TP5 设计的,规则形如:
rewrite ^(.*)$ /index.php?s=$1 last;它不区分应用前缀,且默认指向网站根目录下的 index.php,但 TP6 入口强制在 public/ 目录。继续使用会导致:
- 请求
/admin/login被重写成/index.php?s=/admin/login,但实际入口是/public/index.php -
$_SERVER['PATH_INFO']为空,路由解析失败 - 首页能打开,点菜单或进子路径一律 404
多应用专用 Nginx 规则(推荐宝塔粘贴用)
在宝塔站点设置 →「伪静态」中,**清空原有内容,粘贴以下规则**(注意空格和分号):
rewrite ^/([a-z0-9A-Z_\-]+)/(.*)$ /public/index.php?s=$1/$2 last;
rewrite ^/(.*)$ /public/index.php?s=$1 last;
}
说明:
- 第一行匹配带应用前缀的请求(如
/admin/login),提取admin和login,拼成s=admin/login - 第二行兜底处理根路径、静态资源(如
/robots.txt、/),避免漏转发 -
last是关键——重写后重新进入 location 匹配流程,确保 PHP-FPM 正确加载;用break会丢失 PATH_INFO - 正则中的
[a-z0-9A-Z_\-]+支持字母、数字、下划线、短横线;若应用名含中文或特殊符号(不推荐),可临时改为[^/]+
配套三项硬性配置缺一不可
光写对规则还不够,以下三步必须同步完成:
-
运行目录设为
/public:宝塔 → 网站 → 设置 → 网站目录 → 运行目录 → 下拉选择/public(不是手动输,也不是留空) -
PHP 禁用函数中去掉
putenv和ini_set:TP6 启动时需这两个函数动态设置 PATH_INFO -
确认 PHP 处理块含 PATH_INFO 支持:在站点配置的
location ~ \.php$块内,检查是否有:fastcgi_split_path_info ^(.+\.php)(/.+)$;<br>fastcgi_param PATH_INFO $fastcgi_path_info;
验证是否生效
改完后务必点击宝塔「保存」→「重载 Nginx」(只点保存无效)。验证方式:
- 访问
https://yourdomain.com/→ 应进默认应用(如 index) - 访问
https://yourdomain.com/admin→ 应进 admin 应用,不报 404 - 访问
https://yourdomain.com/static/css/app.css→ 应正常返回 CSS 文件(说明 if 判断生效,真实文件未被重写)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











