内页404但首页正常,说明ThinkPHP已启动、PHP环境无误,问题在于Nginx未将请求正确转发至public/index.php;根本原因有三:root未指向public目录、location /缺少try_files $uri $uri/ /index.php?$query_string;兜底规则、PHP处理块缺失fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;。

内页404但首页能打开,说明ThinkPHP已启动、PHP环境正常,问题卡在Nginx没把请求交到public/index.php手里。Nginx 1.20版本下,TP8.0伪静态失效基本就三类原因:root路径错、转发规则漏、PHP参数缺——改这三项,95%能解决。
root必须严格指向public目录
这是最常被忽略的致命错误。TP8.0入口强制为public/,不是项目根目录。
- 错误写法:
root /www/wwwroot/myapp;(指向项目根,会导致自动加载失败、空白页且无报错) - 正确写法:
root /www/wwwroot/myapp/public; - Windows用户注意用正斜杠+英文引号:
root "D:/www/myapp/public"; - 宝塔用户:网站设置 → 网站目录 → 运行目录必须选
/public,不能留空或选/
location /块必须含标准try_files兜底
别用if (!-e $request_filename)这种老旧写法,TP8.0下它会让PATH_INFO为空,路由静默失效。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 在
server块里找到location / { },确保里面包含这一行:try_files $uri $uri/ /index.php?$query_string; - 结尾的
$query_string不能丢,否则?id=123这类参数会丢失 - 如果项目部署在子目录(如
/myapp/),要单独配location /myapp/ { },并把兜底改成/myapp/index.php?$query_string;
PHP处理块必须传对SCRIPT_FILENAME
缺这行,Nginx日志会报Primary script unknown,PHP根本收不到请求。
- 在
location ~ \.php$ { }块里,必须有:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - 建议同时加上:
fastcgi_param PATH_INFO $fastcgi_path_info;(TP8.0路由解析更稳) - 检查有没有被前面的
if或rewrite提前截断——删掉所有冗余判断,只留干净的PHP处理块
顺手验证两个关键点
改完配置别急着 reload,先确认这两项:
-
快速验证伪静态是否生效:访问
http://你的域名/index.php/user/login,能打开说明框架没问题;再试/user/login,若仍404,说明上面三项还没全对上 -
查Nginx错误日志定位根源:宝塔路径是
/www/wwwlogs/your-site.error.log,搜索Primary script unknown或no such file,日志里一句话就能指出是路径错还是文件找不到
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










