问题出在Nginx未将请求转发至index.php,需同时满足:root指向public目录、location /含try_files $uri $uri/ /index.php?$query_string;、PHP块含fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;。

ThinkPHP伪静态规则写好、Nginx也重启了,但访问 /user/list 仍 404,说明请求根本没进到 ThinkPHP 的路由层——问题不在代码,而在“请求是否真正交到了 public/index.php 手里”。需从服务器转发路径、框架入口识别、运行时环境三方面逐层排查。
先确认伪静态到底有没有起作用
最快速的判断方式:在浏览器中直接访问带 index.php 的地址,例如:
-
http://your-domain.com/index.php/index/hello→ 能打开,说明框架、PHP、数据库都正常; -
http://your-domain.com/index/hello→ 404 或空白,那问题 100% 出在伪静态配置或其依赖环节。
检查 Nginx 配置三个硬性前提
以下三点必须同时满足,缺一不可:
-
root 必须指向
public/目录:比如项目在/www/wwwroot/myapp,则配置中必须是root /www/wwwroot/myapp/public;。若指向项目根目录,会报Class 'think\App' not found且无提示; -
location / 块要有兜底规则:推荐用
try_files $uri $uri/ /index.php?$query_string;。避免用老旧的if (!-e $request_filename),尤其在 TP8 下易导致PATH_INFO为空; -
PHP 处理块必须含关键参数:在
location ~ \.php$内,必须有这一行:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;。漏掉它,Nginx 日志会报Primary script unknown,PHP 根本收不到请求。
验证框架自身是否准备就绪
即使 Nginx 转发正确,ThinkPHP 若未启用路由或参数解析错位,依然静默失败:
- 检查
config/app.php中:url_route_on必须为true,pathinfo_depr必须为'/'; -
url_html_suffix建议设为空字符串'',否则/user/list会被强制要求带.html后缀; - 清空
runtime/cache/和runtime/route/目录,避免旧缓存干扰新规则。
看错误日志,一句话定位根源
别猜,直接查日志:
- Linux 宝塔:日志路径为
/www/wwwlogs/your-site.error.log; - Windows 小皮:路径为
c:\phpstudy_pro\extensions\nginx1.22.1\logs\error.log; - 重点搜索关键词:
not found、Primary script unknown、No input file specified——这些不是报错信息,而是精准线索。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











