伪静态未生效主因是Nginx未正确转发请求至public/index.php,需确保root指向public目录、location使用try_files $uri $uri/ /index.php?$query_string、PHP块配置SCRIPT_FILENAME/PATH_INFO/PATH_TRANSLATED三参数,并在框架中开启路由、设pathinfo_depr为'/'、url_html_suffix为空。

URL里还带着 index.php,说明伪静态没真正生效——不是框架没开路由,而是请求压根没被正确转发到 public/index.php,或者转发后框架无法识别路径。核心就三点:Nginx 配置、入口路径、框架参数必须严丝合缝。
确认 Nginx root 指向 public 目录
ThinkPHP 8.1 强制入口在 public/,如果 Nginx 的 root 还指向项目根目录(比如 /var/www/myapp),那 /index.php 就是错的路径,框架根本加载不起来,更别说解析路由了。
- 正确写法:
root /var/www/myapp/public;(Linux)或root D:/www/myapp/public;(Windows) - 检查是否漏掉分号,路径末尾不要斜杠,也不能有空格或中文
- 改完执行
nginx -t校验,再nginx -s reload
主 location 必须用 try_files,且规则写对
旧式 if (!-e $request_filename) 在 TP8.1 + Nginx 1.22+(尤其是 Windows 下 phpStudy)容易清空 PATH_INFO,导致路由静默失败,页面空白或 404。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 在
location / { }块中写:try_files $uri $uri/ /index.php?$query_string; - 注意:不是
/index.php?s=$uri,TP8.1 默认走 PATHINFO 模式,但?$query_string能兼容并确保参数完整传递 - 这个块必须放在
location ~ \.php$之前,否则不生效
PHP 处理块要配齐关键 fastcgi_param
就算请求转到了 index.php,如果 PHP 找不到真实文件,Nginx 日志会报 Primary script unknown,浏览器可能显示 500 或空白。
立即学习“PHP免费学习笔记(深入)”;
- 在
location ~ \.php$ { }块中,确保包含这三行: fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;-
fastcgi_param PATH_INFO $fastcgi_path_info;(必须加,否则 TP8.1 解析不了路由) fastcgi_param PATH_TRANSLATED $realpath_root$fastcgi_path_info;
框架配置别漏关键项
光靠服务器转发不够,框架自己也得“认路”:
-
config/app.php中:'url_route_on' => true -
'pathinfo_depr' => '/'(不能是-或.,否则拆路径出错) -
'url_html_suffix' => ''(空字符串,不是null或未定义;设成.html就要求 URL 带后缀) - 检查
.env:确保APP_ENV=production且没禁用路由


















