首页能打开、内页404说明框架已启动但伪静态未生效;快速验证:/index.php/路径可访问而直接访问报404,则必为Nginx伪静态配置错误,需同时满足root指向public、location /含try_files $uri $uri/ /index.php?$query_string;、PHP块含fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;三者。

首页能打开、内页访问直接 404,说明 ThinkPHP 框架已启动、入口文件可执行,但请求根本没进到路由系统——问题几乎肯定出在伪静态配置环节,而非代码或路由定义本身。
确认是不是伪静态根本没生效
最快速验证方式:在浏览器中访问 http://你的域名/index.php/任意内页路径(例如 /user/list 或 /index/hello)。
如果这个带 index.php 的地址能正常打开,而直接访问 /user/list 报 404,那就 100% 是伪静态未生效或规则写错了。
Nginx 配置三个关键点必须同时满足
检查你的 Nginx server 块中是否完整包含以下三项,缺一不可:
-
root 必须指向 public 目录:比如项目实际路径是
/var/www/myapp,那root应为/var/www/myapp/public;指向错了一级,所有 rewrite 都会失效 -
location / 块里有标准 try_files 规则:
try_files $uri $uri/ /index.php?$query_string;—— 注意结尾的$query_string不能丢,否则?id=123这类参数会丢失;也别写成/index.php?s=$1,那是 TP5 旧写法,TP6/TP8 不认 -
PHP 处理块中 SCRIPT_FILENAME 正确:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;—— 如果这里写成绝对路径或漏掉$document_root,PHP 就找不到入口文件
宝塔等面板用户特别注意
选了“ThinkPHP”伪静态模板不等于万事大吉:
立即学习“PHP免费学习笔记(深入)”;
- 打开生成的配置文件,确认上面三条规则真实存在,且没有被其他 if/rewrite 冲突覆盖
- 执行
nginx -t测试语法,再运行systemctl reload nginx(或用宝塔面板「重载配置」按钮) - 如果项目结构是 TP6/TP8 标准(含
public/子目录),而站点根目录却指向了项目根而非public,那预设规则大概率失配——建议手动清空伪静态框,粘贴适配 public 入口的规则
顺手检查两个易忽略细节
即使 Nginx 规则看起来没问题,也可能因以下原因失败:
-
URL 大小写不一致:Linux 系统严格区分大小写。前端请求
/User/List,而路由定义的是/user/list,就会 404;Windows 开发时不易发现,上线立刻暴露 -
开启了强制路由但没放行静态资源:若配置了
'url_route_must' => true,而访问的是/static/js/app.js这类路径,又没在路由里显式定义或排除,也会被当成非法路由拦截返回 404



















