问题出在Nginx伪静态配置:root未指向public目录、location/缺try_files规则、PHP块中SCRIPT_FILENAME参数错误,三者缺一不可。

首页能打开、内页访问直接 404,说明 ThinkPHP 框架已启动,但请求根本没进路由系统——问题几乎肯定出在 Nginx 伪静态配置环节,而非代码或路由定义本身。
快速确认是不是伪静态没生效
在浏览器中访问带 index.php 的地址,例如:
http://你的域名/index.php/user/login
如果这个地址能正常打开,而直接访问 /user/login 报 404,那就 100% 是伪静态未生效或规则写错。
Nginx 配置必须同时满足的三个硬性条件
以下三点缺一不可,任一缺失都会导致内页 404:
-
root 必须指向 public 目录:比如项目实际路径是
/www/wwwroot/myapp,则 Nginx 的root必须设为/www/wwwroot/myapp/public(末尾不加斜杠)。宝塔用户请在「网站目录」中将「运行目录」明确选为/public,不能留空或选“/”。 -
location / 块里要有标准兜底规则:必须包含这一行:
try_files $uri $uri/ /index.php?$query_string;
注意:$query_string不能省略,否则?id=123类参数会丢失;也不要写成/index.php?s=$1,那是 TP5 旧写法,TP8 不识别。 -
PHP 处理块中 SCRIPT_FILENAME 必须正确:在
location ~ \.php$ { }内,必须有:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
如果漏掉或写成绝对路径(如/www/wwwroot/myapp/public/index.php),Nginx 错误日志会出现 Primary script unknown,PHP 根本收不到请求。
顺手检查两个易忽略细节
即使上面三条都对了,也可能因这些原因失败:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
URL 大小写不一致:Linux 系统严格区分大小写。前端请求
/User/List,而路由定义的是/user/list,就会 404。Windows 开发时不易发现,上线立刻暴露。 -
开启强制路由但没放行静态资源:若配置了
'url_route_must' => true,又没在路由中显式定义或排除/static/js/app.js这类路径,也会触发 404。
验证和定位靠日志,不是猜
改完配置后别急着刷新页面:
- 先执行
nginx -t检查语法是否正确; - 再运行
nginx -s reload或用宝塔点「重载配置」; - 清空
runtime/cache/和runtime/route/目录,避免旧缓存干扰; - 打开 Nginx 错误日志(宝塔路径:
/www/wwwlogs/your-site.error.log),搜索 not found、Primary script unknown 或 no such file —— 日志会直接告诉你哪一级路径错了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










