宝塔伪静态模板不可通用,TP5用“ThinkPHP”模板、TP6用“ThinkPHP 6”模板、TP8必须手动配置;统一需设运行目录为/public(TP5除外)、放开putenv/ini_set/scandir、配置PATH_INFO或REQUEST_URI参数、重载Nginx。

宝塔面板的伪静态模板不能“通用”,选错直接 404。关键不是看名字里有没有“ThinkPHP”,而是看它适配的是哪个版本的入口结构、路由解析方式和 PHP 运行约束。
TP5.0/5.1 用「ThinkPHP」模板
这是唯一能直接用的内置模板,规则是:
rewrite ^(.*)$ /index.php?s=$1 last;
它匹配 TP5 的三大特征:入口在根目录 /index.php、依赖 $_GET['s'] 解析路由、不强制 PATH_INFO 透传。只要运行目录设为项目根目录(非 /public),禁用函数没勾 putenv 和 ini_set,基本就能通。
TP6.0/6.1 用「ThinkPHP 6」模板
宝塔从较新版本起单独提供了这个选项,规则同样是:
if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; }
但它隐含适配了 TP6 的要求:运行目录必须设为 /public,且 Nginx 配置中已启用 fastcgi_param PATH_INFO $fastcgi_path_info;。注意:这里的 /index.php 实际指向的是 /public/index.php,靠的是宝塔自动把运行目录作为 root 处理。
TP8.0 必须手动配置,不能依赖下拉菜单
宝塔当前所有下拉模板(包括「ThinkPHP 6」)都不适配 TP8。原因有三:
立即学习“PHP免费学习笔记(深入)”;
- TP8 强制 PHP ≥8.0,且大量使用
#[Attribute]和联合类型,对putenv/ini_set依赖更深,禁用函数必须全部清空 - TP8 默认关闭
s=参数模式,原生走REQUEST_URI或注解路由,s=规则只是兼容 fallback,不是主路径 - TP8 要求每次修改注解后执行
php think clear --all,而伪静态规则若仍用s=模式,会绕过注解路由,导致控制器找不到方法
正确做法是手动写规则,并配合注解启用:
- 伪静态框内粘贴:
if (!-e $request_filename) { rewrite ^(.*)$ /index.php last; }(不带s=) - 确保 Nginx 的
location ~ \.php$块中包含:fastcgi_param REQUEST_URI $request_uri; - 控制器类或方法上明确加
#[Route('user/list')]或#[Domain('admin')]等注解 - 修改注解后必须执行
php think clear --all,否则路由不生效
统一要检查的底层项(三个版本都绕不开)
无论选哪个模板,以下四点不满足,伪静态一定失败:
- 运行目录设为
/public(TP5 除外,它设项目根目录) - PHP 禁用函数中移除
putenv、ini_set、scandir - Nginx 配置里
location ~ \.php$块中存在fastcgi_param PATH_INFO $fastcgi_path_info;(TP8 可改用REQUEST_URI) - 保存伪静态后,必须在终端执行
nginx -t && systemctl reload nginx或在宝塔点击「重载 Nginx」



















