phpEnv 无根目录配置项,必须手动修改 Nginx 配置文件中的 root 指令指向 public 目录,并重载 Nginx、清空 open_basedir 且重启 phpEnv 全服务,否则路由失效、.env 泄露、文件操作报错。

phpEnv 不能直接修改网站根目录到 public 文件夹——它压根不提供「网站根目录」配置项,所有站点默认都指向项目根(即含 app/、config/、public/ 的那一层),必须靠手动改 Nginx 配置文件实现。
为什么 phpEnv 没有“根目录设置”选项
phpEnv 是轻量级本地 PHP 环境套件,定位是快速启停多版本 PHP + MySQL,不是全功能面板。它的 Web 服务由内置 Nginx 驱动,但管理界面只暴露 PHP 版本、端口、扩展开关等基础项,root 指令被固化在自动生成的 server 块里,不开放编辑入口。
常见错误现象:Laravel 或 ThinkPHP 部署后访问首页正常,但点链接 404、.env 可直接下载、storage/logs 报权限错误——全是因请求没经 public/index.php 入口,框架自动加载和路由机制根本没启动。
- phpEnv 启动后,实际生效的配置文件路径是:
C:\phpEnv\nginx\vhost\your-site.conf(Windows)或/usr/local/phpenv/nginx/vhost/your-site.conf(Linux/macOS) - 该文件中默认
root指向项目根目录,例如:root /www/wwwroot/my-app; - 你必须手动把它改成:
root /www/wwwroot/my-app/public;
改完 Nginx 配置后必须 reload,否则不生效
改完 your-site.conf 不能只保存就完事。phpEnv 的 Nginx 不响应 nginx -s reload,必须用它自带的控制脚本:
立即学习“PHP免费学习笔记(深入)”;
- Windows 下双击运行:
C:\phpEnv\phpenv.bat→ 选「5. 重启 Nginx」 - Linux/macOS 下执行:
sudo /usr/local/phpenv/phpenv.sh restart nginx - 别用
service nginx reload或杀进程再启——phpEnv 的 Nginx 是非标准安装路径,系统命令找不到它
验证是否生效:访问 http://localhost/.env 应返回 404 或 403;访问 http://localhost/index.php 应触发框架逻辑(如 Laravel 显示欢迎页,ThinkPHP 显示「The requested URL was not found」而非裸 PHP 报错)。
ThinkPHP 6 还得同步配伪静态规则
即使 root 改对了,ThinkPHP 6 的 URL 路由仍会 404——因为 phpEnv 默认没给任何伪静态模板,Nginx 不知道要把 /user/list 这类路径重写到 /index.php?s=/user/list。
打开刚才那个 your-site.conf,在 server 块里 location / 区域内,补上 TP6 官方要求的 rewrite 规则:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
注意两点:
- 这个
if必须写在location /内部,不能丢到 server 块顶层 - 不要用宝塔那种「ThinkPHP」旧模板(对应 TP5),TP6 的
s=参数格式不兼容
open_basedir 限制常被忽略,导致文件操作失败
phpEnv 默认开启 open_basedir,且值固定为项目根目录(如 /www/wwwroot/my-app/:/tmp/:/proc/)。一旦你把 root 改成 public 子目录,PHP 执行时仍按原路径校验——file_get_contents('../.env') 就会因跨出限制报错。
解决方式只有改 PHP 配置,路径取决于你当前启用的 PHP 版本:
- 找到对应版本的
php.ini(如C:\phpEnv\php\php-8.2\php.ini) - 搜索
open_basedir,把它设为空:open_basedir =(等号后不留空格) - 保存后,**必须重启整个 phpEnv 服务**(不只是 Nginx),否则 PHP-FPM 进程不会读新配置
这个点最容易漏:改了 Nginx root、加了 rewrite、却忘了 open_basedir,结果日志里满屏 Warning: file_get_contents(): open_basedir restriction in effect,死活查不出原因。



















