thinkphp6伪静态配置失败主因是nginx规则位置错误、入口路径未对齐public、path_info未透传;须在location ~ .php$前手动添加含/public/index.php的rewrite规则,并确保运行目录设为/public、禁用函数不包含putenv/ini_set、fastcgi_param path_info启用。

ThinkPHP6 伪静态配不对,90% 是因为 Nginx 规则位置错了、入口路径没对齐、PATH_INFO 没透传——三者缺一,必 404 或白屏。
宝塔里不能直接选“ThinkPHP”模板
宝塔下拉菜单里的“ThinkPHP”模板是为 TP5 设计的,规则是 rewrite ^(.*)$ /index.php?s=$1 last;,但 TP6 默认不走 s 参数,而是依赖 PATH_INFO 或 REQUEST_URI 解析路由。直接套用会导致:
- 请求被重写成
/index.php?s=/user/list,但 PHP 层根本收不到$_SERVER['PATH_INFO'] - 入口文件实际在
public/index.php,而规则指向了网站根目录下的/index.php(404) - 规则若插在
location ~ \.php$后面,Nginx 会优先匹配 .php 文件,if根本不执行
必须手动加 location 块,且位置和写法要精确
进宝塔 → 网站 → 配置文件,在 server 块内、location ~ \.php$ 之前 插入:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /public/index.php?s=$1 last;
}
}
关键点:
-
/public/index.php是硬性要求:TP6 入口强制在public/,站点根目录应设为项目根(如/www/wwwroot/myapp),所以 rewrite 目标必须带/public/ -
last不可换:换成break会导致重写后不再重新匹配 location,/public/index.php?s=xxx被当成静态文件返回 404;换成redirect会暴露真实 URL -
if (!-e $request_filename)是兜底:确保真实存在的.js、.css、图片不被重写
光写规则不够,还得同步改三项硬配置
rewrite 成功只是第一步。TP6 启动时会检测 $_SERVER['PATH_INFO'] 是否可用,任意一项断掉就报 URL pathinfo not supported:
-
运行目录必须设为
/public:宝塔 → 网站 → 设置 → 网站目录 → 运行目录 → 选择/public(不是留空,也不是/) -
PHP 禁用函数里不能勾选
putenv和ini_set:TP6 在public/index.php开头靠这两个函数动态设置PATH_INFO -
fastcgi_param PATH_INFO必须启用:在站点配置的location ~ \.php$块内,确认有这行:fastcgi_param PATH_INFO $fastcgi_path_info;,且前面有fastcgi_split_path_info ^(.+\.php)(/.+)$;
Apache 用户别只丢 .htaccess 就完事
Cloudways、部分虚拟主机默认禁用 .htaccess 解析,即使规则写对也无效:
- Apache 下必须确认虚拟主机配置中
<directory></directory>块含AllowOverride All,否则.htaccess被完全忽略 -
.htaccess必须放在public/目录下(不是项目根目录),且开头要有RewriteBase / - 规则末尾必须带
[QSA,PT,L]:漏QSA会导致查询参数(如?page=2)丢失;漏PT会让 Apache 不把重写结果交给 PHP-FPM 处理
最常被跳过的其实是运行目录和 fastcgi_param PATH_INFO —— 很多人反复调规则却忘了这两处,结果所有努力都卡在框架启动前。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











