thinkphp6在nginx下404主因是请求未进入框架:运行目录未设为/public、伪静态规则未置于location ~ .php$之前且目标应为/public/index.php、path_info未透传;三者缺一必404。

ThinkPHP6在Nginx下出现404,绝大多数情况是请求压根没进框架——Nginx直接返回了原生404,public/index.php根本没被执行。核心问题就三个:入口路径不对、重写规则位置错、PATH_INFO没传过去。
运行目录必须设为 `/public`
TP6强制入口在public/index.php,但宝塔新建站点默认把网站根目录指向项目顶层(如/www/wwwroot/myapp)。这时Nginx会去/www/wwwroot/myapp/index.php找文件,当然404。
进宝塔 → 网站 → 设置 → 网站目录 → 运行目录,选/public(注意开头有斜杠),保存后务必点「重载Nginx」。
验证方式:
- 访问 https://yourdomain.com/index.php 应该 404
- 访问 https://yourdomain.com/public/index.php 能打开首页,或直接访问域名能进首页
伪静态规则不能选模板,要手动加 location 块
宝塔下拉菜单里的「ThinkPHP」模板是给TP5设计的,规则是rewrite ^(.*)$ /index.php?s= last;,它假设入口在根目录,且不带/public/前缀——套用到TP6上,重写目标变成不存在的/index.php,必然404。
正确做法:进宝塔 → 网站 → 配置文件,在server块内、location ~ \.php$之前插入:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /public/index.php?s=$1 last;
}
}
关键点:
- 必须写/public/index.php,不是/index.php
- 必须放在location ~ \.php$之前,否则PHP匹配优先级更高,if不执行
- 必须用last,换成break或redirect会导致重写后不再走PHP处理块
PHP层必须透传 PATH_INFO
TP6启动时会检测$_SERVER['PATH_INFO']是否可用,缺一不可:
- PHP禁用函数里不能勾选
putenv和ini_set(进宝塔 → 软件商店 → PHP设置 → 配置修改 → 删除这两项) - 确认PHP处理块中有
fastcgi_split_path_info ^(.+\.php)(/.+)$;和fastcgi_param PATH_INFO $fastcgi_path_info; - 如果用的是宝塔自动生成的配置,通常已有,但升级PHP后可能被重置,需手动检查
改完必须重载,别只点保存
宝塔界面上点「保存」只是写入配置文件,不等于生效。必须点「重载Nginx」,或者SSH执行:
nginx -t && service nginx reload
顺手测试一下:curl -I https://yourdomain.com/user/list
如果返回HTTP/1.1 200 OK,说明已进PHP;如果还是404 Not Found且带nginx/...,说明还在Web服务器层,得回头检查规则位置和运行目录。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











