ThinkPHP 6.0 伪静态失败主因是运行目录未设为 /public、PATH_INFO 未透传、或重写未进 index.php;须将运行目录设为 /public,粘贴 if(!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; } 规则,并确保 scandir 未禁用、fastcgi_param PATH_INFO $fastcgi_path_info 已启用。

ThinkPHP 6.0 伪静态配不起来,基本不是规则写错了,而是 public 目录没对上、PATH_INFO 没透传、或重写根本没进 index.php —— 这三点错一个,就全 404。
宝塔面板必须改「运行目录」为 /public
宝塔新建站点默认根目录指向项目顶层(比如 /www/wwwroot/myapp),但 TP6 强制要求 Web 可访问路径只能是 public/ 子目录。否则:
-
index.php暴露在根下,config/、app/等目录可被直接下载 - 所有路由请求都找不到入口,返回 Nginx 默认 404
- 即使伪静态规则写了,rewrite 目标
/index.php也根本不存在(真实路径是/public/index.php)
操作步骤:
- 进宝塔 → 网站 → 找到你的站点 → 设置 → 网站目录 → 运行目录:选择
/public - 点「重载 Apache/Nginx」,不是只点「保存」
- 验证:访问
http://你的域名/index.php应能打开首页;访问http://你的域名/config/app.php必须返回 404
Nginx 伪静态规则必须用 if(!-e $request_filename) + last
宝塔自带的「ThinkPHP」伪静态模板是为 TP5 写的,直接套用会导致 TP6 路由解析失败。关键点有三个:
立即学习“PHP免费学习笔记(深入)”;
- 规则必须放在
location ~ \.php$块之前,否则 PHP 文件匹配优先级更高,if根本不执行 - 必须用
last,不能用break或redirect——last让 Nginx 重走 location 匹配流程,确保请求真正进到 PHP 处理块 - rewrite 目标要写成
/index.php?s=$1,不是/index.php?s=/$1(开头多斜杠会导致$_GET['s']解析异常)
正确写法(粘贴到宝塔「伪静态」文本框中):
if(!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
PATH_INFO 必须透传,且 scandir 不能禁用
TP6 启动时依赖 scandir() 扫描目录加载类和配置;路由解析又靠 $_SERVER['PATH_INFO']。这两项任一被拦,轻则白屏,重则报 URL pathinfo not supported。
- 进宝塔 → 软件商店 → 找到你用的 PHP 版本 → 设置 → 配置修改 → 搜索
disable_functions→ 删掉其中的scandir(保留exec、system是安全的) - 检查站点配置中
location ~ \.php$块内是否包含这两行(缺一不可):fastcgi_split_path_info ^(.+\.php)(/.+)$;fastcgi_param PATH_INFO $fastcgi_path_info; - 确认
putenv和ini_set没被禁用 —— TP6 启动时需动态设置PATH_INFO
验证是否真生效,别只看首页
首页能打开不代表伪静态成功。很多配置看似正常,但带参数的 URL(如 /user/list?page=2)或深层路由(如 /admin/login)会直接崩。
- 访问一个明显不存在的路径,比如
https://你的域名/xyzabc:如果返回 TP6 自带的 404 页面(带框架样式),说明请求已进框架;如果返回 Nginx 默认 404,说明 rewrite 没触发 - 访问带查询参数的路由,比如
https://你的域名/index/test?page=3:检查控制器里input('page')是否能拿到值,拿不到就是&$args没传进去或规则漏了$args - 改完配置后必须「重载 Nginx」+「重启 PHP-FPM」,仅重载不生效
最常被忽略的是:改了 Nginx 配置却没改 PHP-FPM 的 fastcgi_param PATH_INFO,或者改了但没重启 PHP-FPM —— 此时 Nginx 传了,PHP 就是收不到。



















