ThinkPHP6.1在Nginx下伪静态失效主因是root未指向public目录、location /规则位置错误或PATH_INFO未启用;需确保root设为public、location /用try_files且置于php块前、fastcgi_param PATH_INFO正确配置并重启服务。

ThinkPHP6.1 在 Nginx 下伪静态失效,90% 是因为 root 没指对 public 目录、location / 规则写错位置、或 fastcgi_param PATH_INFO 被禁用——不是框架问题,是配置链断了。
确认 Nginx 的 root 必须指向 public 目录
TP6.1 强制入口为 public/index.php,Web 根目录设错会导致 autoload 失败、think\App 类找不到、直接白屏或 500。宝塔、phpEnv、手动编译 Nginx 都一样,这步不能跳过。
- 宝塔:网站 → 配置文件 → 找到
root行,改成类似root /www/wwwroot/myapp/public;(结尾不加斜杠) - phpEnv:网站管理 → 修改 → 「网站根目录」填完整路径,如
D:/phpEnv/www/myapp/public,改完必须点「重启 Nginx」+「重启 PHP-FPM」 - 验证方式:访问
http://yoursite.com/index.php应能打开;访问http://yoursite.com/app/config.php必须返回 404(否则根目录仍设在项目顶层,有严重安全风险)
location / 块必须用 try_files,且放对位置
规则必须写在 location ~ \.php$ 之前,否则 PHP 文件匹配优先级更高,重写根本不会触发。Nginx 官方已明确不推荐 if (!-e $request_filename),TP6.1 在 phpEnv 下甚至会报 nginx: [emerg] "if" directive is not allowed here。
- 正确写法(放在
server { }内、location ~ \.php$之前):location / { try_files $uri $uri/ /index.php?s=$uri&$args; } -
s=$uri不能写成s=/$uri(开头多斜杠会让 TP6 解析出错的PATH_INFO) - 必须带
&$args,否则/user/list?page=2这类带查询参数的 URL 会丢参 - 不要在
location /里写rewrite或if,TP6.1 + Nginx 组合下极大概率 500 或重定向循环
检查 fastcgi_param PATH_INFO 是否启用
即使 try_files 正确,TP6.1 仍可能报 URL pathinfo not supported。这不是 Nginx 问题,而是 PHP-FPM 没把路径信息传进来。
立即学习“PHP免费学习笔记(深入)”;
- 打开 PHP-FPM 配置文件(宝塔:PHP 设置 → 配置文件;phpEnv:路径类似
D:/phpEnv/php/php-8.2/etc/php-fpm.d/www.conf) - 搜索
fastcgi_param PATH_INFO,确保这行未被注释,且值为:fastcgi_param PATH_INFO $fastcgi_path_info;
- 如果找不到,就手动加在
fastcgi_param SCRIPT_FILENAME后面;改完必须「重启 PHP-FPM」,仅重载不生效 - 顺手检查
php.ini中disable_functions是否含scandir——TP6.1 启动时扫描应用目录依赖它,禁用会导致白屏或Call to undefined function think\scandir()
验证 rewrite 是否真生效,别信“保存就完事”
改完配置后,Nginx 重载或重启只是第一步。真正要确认的是请求是否进了 TP6.1 的路由层,而不是被 Nginx 自己 404 或返回 index.php 原始内容。
- 访问一个真实存在的路由,比如
/index/hello(默认控制器方法),应输出内容,而非空白或原始 PHP 代码 - 访问一个不存在的路由,比如
/abc123,应返回 TP6.1 自带的 404 页面(含框架样式),而不是 Nginx 默认的 404 提示——后者说明请求根本没进框架 - 临时在
public/index.php底部加一行:var_dump($_SERVER['REQUEST_URI'], $_GET, $_SERVER['PATH_INFO'] ?? 'not set');
,看$_SERVER['PATH_INFO']是否有值、$_GET是否包含查询参数
最常被忽略的一点:TP6.1 的 config/app.php 中 'url_route_on' => true 必须开启,否则所有伪静态规则都无效——它连路由层都不进,重写再准也没用。



















