绝大多数情况是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路由失效、访问除首页外的路径直接404,绝大多数情况不是代码写错了,而是Nginx没把请求真正交到index.php手里——它还在傻找物理文件。
确认是不是伪静态根本没起作用
最快速的判断方式:在浏览器里访问 http://你的域名/index.php/任意路由(比如 /index/user)。如果能正常打开,说明框架本身没问题;如果还是404或空白,问题出在PHP环境、权限或入口路径上。如果前者能通、后者404,那100%是伪静态配置没生效或配错了。
检查Nginx配置三个硬性要点
伪静态要起作用,以下三项必须同时满足,缺一不可:
-
root 必须指向 public 目录:例如项目在
/www/wwwroot/myapp,那么root应该是/www/wwwroot/myapp/public,而不是项目根目录。写错会导致自动加载失败、页面空白且无报错。 -
location / 块里要有兜底规则:推荐用
try_files $uri $uri/ /index.php?$query_string;。避免用老旧的if (!-e ...)写法,尤其在 Windows 或 ThinkPHP 8.0 下容易让PATH_INFO为空,导致路由静默失效。 -
PHP 处理块必须含关键参数:在
location ~ \.php$里,确保有这行:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;。漏掉它,Nginx 日志会报Primary script unknown,PHP 根本收不到请求。
子目录或多应用部署要特别处理
如果你的站点地址是 https://example.com/myapp/ 或用了多应用(比如 /admin/xxx),不能直接套用根目录规则:
- 子目录部署时,
try_files的兜底路径要带前缀,例如/myapp/index.php?$query_string;location也要匹配子目录,如location /myapp/ { ... }。 - 多应用模式下,
root仍必须指向对应应用的public目录;domain_bind配置的域名要和浏览器地址栏完全一致(包括 www、端口);别删掉项目根目录下的app/controller,否则框架跳过多应用识别,所有请求都进默认应用。
别忘了验证和清理
改完配置别急着测试,先做这几步:
- 执行
nginx -t检查语法是否正确; - 运行
nginx -s reload或通过宝塔/PHPStudy 重启服务; - 清空 ThinkPHP 的
runtime/cache/和runtime/route/目录,避免旧路由缓存干扰; - 打开 Nginx 错误日志(如
/www/wwwlogs/your-site.error.log),搜索not found或Primary script unknown,日志会直接告诉你卡在哪一步。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











