ThinkPHP在宝塔跑不起来主因是网站运行目录未设为/public且伪静态未生效;需将运行目录设为/public、选用TP6专用伪静态规则、确保PATH_INFO透传、开放必要PHP函数并赋权runtime目录。

ThinkPHP 在宝塔跑不起来,90% 是网站运行目录没设对 + 伪静态规则没生效,不是代码问题,也不是 PHP 版本问题。
网站运行目录必须设为 /public
ThinkPHP 6 的入口文件 index.php 只能放在 public/ 目录下,且该目录必须是 Web 可直接访问的唯一根路径。宝塔新建站点时默认指向项目根(如 /www/wwwroot/myapp),这会导致:
-
config/、app/等敏感目录被直接暴露在浏览器中 -
index.php被当成普通 PHP 文件执行,而非框架入口 - 路由解析失败,首页可能打开,但所有二级页面 404
操作路径:宝塔 → 网站 → 找到站点 → 设置 → 网站目录 → 运行目录 → 选择 /public(注意:不是留空,不是 /,也不是手动输入路径)
改完后必须点击「重载 Nginx」或「重载 Apache」,否则配置不加载。
立即学习“PHP免费学习笔记(深入)”;
伪静态规则必须用 TP6 专用版,不能选宝塔默认“ThinkPHP”模板
宝塔内置的「ThinkPHP」伪静态模板是为 TP5.x 设计的,它假设入口在网站根目录、使用 index.php?s= 形式传参。而 TP6 默认启用 PATHINFO 模式、入口在 /public/index.php,且常关闭 index.php 入口——两者不兼容。
常见错误现象:
- 首页能打开,点菜单就 404
- URL 中始终带
index.php,怎么配都去不掉 - 伪静态框里粘了规则,但保存后没反应
正确做法(Nginx):
进宝塔 → 网站 → 设置 → 伪静态 → 清空原有内容 → 粘贴以下规则:
if(!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
关键点:
- 必须用
last,不能用break或redirect;last才会触发重新匹配 location,让请求真正进到 PHP 处理块 - 规则中写的是
/index.php,不是/public/index.php——因为运行目录已设为/public,Nginx 当前上下文就是该目录 - 如果用了多应用模式(如
/admin、/api),需换用两条 rewrite 规则,并确保正则能捕获应用前缀
PATH_INFO 必须透传,否则 TP6 路由全挂
即使伪静态和运行目录都对了,TP6 仍可能报错「URL pathinfo not supported」或路由无法识别,根本原因是 PHP 没收到原始路径信息。
检查路径:
- 宝塔 → 网站 → 设置 → 配置文件 → 找到
location ~ \.php($|/)块 - 确认里面包含这两行(缺一不可):
fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info;
另外检查 PHP 禁用函数:
- 宝塔 → PHP 设置 → 禁用函数 → 确保
putenv、ini_set未被禁用(TP6 启动时需动态设置 PATH_INFO) -
scandir也要放开,否则runtime目录自动创建失败
最后别忘了给 runtime 目录赋权:chown -R www:www /www/wwwroot/myapp/runtime,否则日志、缓存全写不进去。
最常被忽略的一点:改完伪静态后只点了「保存」,没点「重载 Nginx」;或者改了运行目录,但没同步重启 PHP 进程。Nginx 和 PHP-FPM 是两个独立服务,任一没刷新,配置就等于白配。



















