ThinkPHP在Nginx下伪静态需三者协同:Nginx用try_files正确转发至public/index.php、root指向public目录、PHP fastcgi_param传入$realpath_root和PATH_INFO;框架开启路由、pathinfo_depr设为/、url_html_suffix留空;缺一将导致404或白屏。

ThinkPHP 在 Nginx 下实现伪静态,核心就三点:Nginx 正确转发请求到 public/index.php、框架路由真正启用、两者参数逻辑对得上。光改其中一项,大概率 404 或白屏。
Nginx 配置必须用 try_files(推荐且稳定)
旧式 if (!-e $request_filename) 写法在 Windows、PHP 8.2+ 和 ThinkPHP 8.x 下容易导致 PATH_INFO 为空,页面直接空白,不报错,极难排查。
请直接替换为以下标准配置:
location / {
index index.php;
try_files $uri $uri/ /index.php?$query_string;
}⚠️ 关键细节:
-
root指令必须指向public/目录,例如:root /www/wwwroot/myapp/public;
若指向项目根目录(如/myapp/),会找不到vendor/autoload.php,报Class 'think\App' not found并静默白屏。 - 这段
location /要放在server { }块内,且不能嵌套在其他if或location中。 - 若部署在子目录(如
https://site.com/myapp/),把最后一项改为:/myapp/index.php?$query_string;
PHP 处理块要传对 SCRIPT_FILENAME
在同一个配置文件中,找到 location ~ \.php$ { } 块,确保包含这三行(缺一不可):
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param QUERY_STRING $query_string;
✅ 推荐用 $realpath_root(非 $document_root),它能正确解析符号链接,ThinkPHP 8 强依赖此项。
❌ 不要用 $request_filename 拼路径——Windows 下大小写或反斜杠易出错,日志常报 Primary script unknown。
ThinkPHP 框架内必须同步开启并匹配
打开 config/app.php,确认以下三项:
立即学习“PHP免费学习笔记(深入)”;
-
'url_route_on' => true—— 路由开关必须开 -
'pathinfo_depr' => '/'—— 必须是/,和try_files中?$query_string的分隔逻辑一致 -
'url_html_suffix' => ''—— 留空,才能支持/user/list这类无后缀 URL;设成.html就只能访问带后缀的地址
TP6/8 默认开启路由,但检查 app/middleware.php 是否误删了:think\middleware\ParseUrl::class
验证顺序别跳步
- 先测带
index.php的地址:http://localhost/index.php/index/hello→ 能打开,说明 PHP 和框架本身正常 - 再测伪静态地址:
http://localhost/index/hello→ 404?查 Nginx 是否重载、root是否指对public、try_files是否写错位置 - 白屏(HTTP 200 但空内容)?立刻看 Nginx 错误日志,搜
Primary script unknown或No input file specified,90% 是SCRIPT_FILENAME拼错了
不复杂但容易忽略



















