phpenv下thinkphp6/8需手动配置nginx:站点配置位于c:\phpenv\nginx\vhost\或/usr/local/phpenv/nginx/vhost/,必须用if+rewrite替代try_files,并显式启用fastcgi_param path_info,且在public/index.php开头手动赋值$_server['path_info']。

phpEnv 不支持 .htaccess,Nginx 配置必须手动写进站点 server 块,且不能依赖 PATH_INFO 原生传递——否则 TP6/TP8 会直接报 URL pathinfo not supported 错误。
phpEnv 的 Nginx 配置位置在哪
phpEnv 默认把每个站点的 Nginx 配置放在:C:\phpEnv\nginx\vhost\yourdomain.conf(Windows)或/usr/local/phpenv/nginx/vhost/yourdomain.conf(Linux)。不是在宝塔那种图形界面点几下就行,必须用文本编辑器直接改这个文件。改完要手动执行:phpenv nginx -s reload 或双击 phpEnv 主界面的「重载 Nginx」按钮,否则配置不生效。
location / 块里必须用 if + rewrite,别碰 try_files
phpEnv 自带的 Nginx 版本(多为 1.20.x 或 1.22.x)对 try_files 处理 $fastcgi_path_info 有兼容问题,用 try_files $uri $uri/ /index.php?s=$uri&$args; 会导致 TP6/TP8 拿不到完整路由路径,返回空响应或 500。正确写法是:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
注意三点:
-
last是强制要求,它让重写后重新进入 location 匹配流程,确保请求最终落到location ~ \.php$块里 - 这段必须放在
location ~ \.php$之前,否则 PHP 文件优先匹配,rewrite 根本不触发 - 不能加
break,加了就卡在 rewrite 阶段,/index.php?s=xxx不会被 PHP-FPM 接收
PHP-FPM 必须显式传 PATH_INFO,且不能被覆盖
phpEnv 的 PHP 配置默认没禁用 putenv 和 ini_set,但它的 Nginx fastcgi_params 文件里,fastcgi_param PATH_INFO 这行常被注释掉或写成空值。打开:C:\phpEnv\nginx\conf\fastcgi_params(Windows)或对应路径,确认包含这一行且未被注释:
fastcgi_param PATH_INFO $fastcgi_path_info;
如果不存在,就手动加在最后;如果被写成 fastcgi_param PATH_INFO "";,删掉或改成上面那行。另外检查你的站点配置中是否重复定义了 fastcgi_param PATH_INFO,重复定义会覆盖全局设置,导致 TP6 启动时读不到真实路径。
TP6/TP8 入口文件要补一行 $_SERVER['PATH_INFO'] 赋值
即使 Nginx 和 PHP-FPM 都配对了,phpEnv 环境下仍常出现 URL pathinfo not supported。根本原因是 phpEnv 的 CGI 模式对 $_SERVER['PATH_INFO'] 解析不稳定。最稳的临时解法是在 public/index.php 开头加:
$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'] ?? '';
这行要在 require __DIR__ . '/../vendor/autoload.php'; 之前。上线前可以删,但调试阶段建议保留——它绕过了 Nginx 的 PATH_INFO 解析链,直接喂给框架原始 URL,TP6/TP8 的路由解析器能正常工作。
复杂点在于:phpEnv 是本地开发环境,没有统一的「重载即生效」机制,每次改配置都要确认三个地方是否同步——Nginx 配置、fastcgi_params、入口文件。漏一个,404 或 500 就立刻出现,而且错误日志分散在 C:\phpEnv\nginx\logs\error.log 和 PHP 的 php_error.log 里,得两边一起看。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











