选了宝塔“ThinkPHP”模板仍404,因其专为TP5的s=参数设计,而TP6/8强制入口在/public/且依赖PATH_INFO;必须设运行目录为/public、替换规则为try_files或if+rewrite、启用fastcgi_param PATH_INFO $fastcgi_path_info;并重载Nginx。

选了宝塔的“ThinkPHP”伪静态模板却还是404,不是模板没生效,而是它根本就**不匹配你的 ThinkPHP 版本和项目结构**。尤其 TP6/TP8 默认入口在 public/ 目录、默认用 pathinfo 模式,而宝塔预设规则是为 TP5.x(index.php?s= 风格)写的——直接套用,99% 会 404。
检查运行目录是否设为 /public
这是最常被忽略的硬性前提:
- 进宝塔 → 网站 → 你的站点 → 设置 → 网站目录 → “运行目录”必须选择 /public(不能留空、不能选 /、也不能选项目根目录)
- 如果项目路径是
/www/wwwroot/myapp/,那实际生效的 root 就得是/www/wwwroot/myapp/public - 没设对,Nginx 根本找不到
index.php,连 PHP 都没进去,直接返回原生 404
确认伪静态规则已真实写入配置文件
宝塔点“保存” ≠ 规则已生效:
- 打开对应站点的 Nginx 配置文件(路径类似:
/www/server/panel/vhost/nginx/your-site.conf) - 搜索
location /或rewrite,确认里面有没有你期望的规则(比如try_files $uri $uri/ /index.php?$query_string;) - 执行命令验证并重载:
nginx -t && nginx -s reload(宝塔里点“重载配置”,不是“重启”)
替换掉默认的“ThinkPHP”模板规则
手动清空伪静态框,粘贴适配 TP6/TP8 的规则(任选其一):
-
推荐用 try_files(需确保运行目录已设为 /public):
location / {<br> try_files $uri $uri/ /index.php?$query_string;<br>} -
若用 if+rewrite(兼容性更强,适合宝塔):
if (!-e $request_filename) {<br> rewrite ^(.*)$ /index.php?$1 last;<br>}
注意:这里用$1是为了保留 pathinfo,不是$query_string;且必须放在location ~ \.php$块之前
检查 PHP 是否收到 PATH_INFO
规则转发成功,但路由仍不匹配,可能是 PHP 没拿到路径参数:
- 在
location ~ \.php$块里,确认有这行:fastcgi_param PATH_INFO $fastcgi_path_info; - 同时确保:
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;(不是$document_root) - 测试方法:临时在控制器里输出
$_SERVER['PATH_INFO'],访问/user/list看是否为/user/list
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











