ThinkPHP 8.0 的 Nginx 伪静态配置需 root 指向 public 目录、try_files 替代 if+rewrite、PHP 块中 fastcgi_param SCRIPT_FILENAME 使用 $document_root,并确保框架开启路由。

一、必须把 root 指向 public 目录
TP8.0 强制要求 Web 根目录为 项目根目录下的 public/ 子目录,不是项目根目录本身。
- ✅ 正确写法:
root /www/wwwroot/myapp/public; - ❌ 错误写法:
root /www/wwwroot/myapp;(会导致 autoload 失败、Class 'think\App' not found) - Windows 路径用正斜杠:
root D:/www/myapp/public;,末尾分号不能漏
二、用 try_files 替代 if+rewrite
旧式 if (!-e ...) 在 Windows 和 TP8.0 下极易导致 $_SERVER['PATH_INFO'] 为空,引发静默白屏。推荐标准写法:
- 在
server块内添加:
location / {<br> try_files $uri $uri/ /index.php?$query_string;<br>}
- 若部署在子目录(如
https://site.com/tp8/),则 fallback 改为:/tp8/index.php?$query_string - 不要用
s=$1类写法——TP8.0 默认走 QUERY_STRING 模式,s=参数易被截断或丢失 GET 数据
三、确保 PHP 处理块完整且位置正确
这个 location 块必须存在,且必须包含关键参数:
立即学习“PHP免费学习笔记(深入)”;
- 确认有类似这样的 PHP 处理块(通常已存在,只需检查内容):
location ~ \.php$ {<br> try_files $uri =404;<br> fastcgi_pass 127.0.0.1:9000;<br> fastcgi_index index.php;<br> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br> include fastcgi_params;<br>}
-
SCRIPT_FILENAME必须用$document_root(不是$realpath_root或拼接路径),因为 root 已指向 public,$document_root才能准确解析到public/index.php - 删除所有
fastcgi_split_path_info相关行——TP8.0 不依赖 PATH_INFO,启用它反而会破坏路由
四、框架内也要开启路由
服务器配置再对,框架没开路由也白搭:
- 检查
config/app.php中:'url_route_on' => true, - 确认未在
.env中设APP_DEBUG=false且关闭日志,导致错误静默 - 多应用模式下,还需检查
domain_bind是否与访问域名完全一致(含端口、www 前缀)



















