nginx需手动配置thinkphp6伪静态:root必须指向public目录,server块内location /中用try_files $uri $uri/ /index.php?s=$uri&$args,禁用if,且fastcgi_param path_info须启用。

phpEnv 不是宝塔,没有图形化伪静态模板可选,所有规则必须手动写进 Nginx 配置文件;直接套用宝塔的 if(!-e $request_filename) 块大概率 500 或重定向循环——因为 phpEnv 的默认 root 和 fastcgi_param 配置与宝塔不同。
确认 public 目录为真实 Web 根目录
ThinkPHP 6 的入口强制在 public/ 下,phpEnv 新建站点时默认根目录指向项目顶层(如 D:/phpEnv/www/myapp),必须手动改成 D:/phpEnv/www/myapp/public:
- 打开 phpEnv 主界面 → 网站管理 → 找到对应站点 → 点击「修改」→ 修改「网站根目录」为
public子目录完整路径 - 改完后必须点「重启 Nginx」+「重启 PHP-FPM」,仅重载不生效
- 验证方式:访问
http://localhost/index.php能打开,但http://localhost/app/config.php应返回 404(否则根目录设错,存在安全风险)
在 server 块内插入 TP6 专用 location 规则
phpEnv 的 Nginx 配置文件位于 D:/phpEnv/nginx/conf/vhost/xxx.conf,编辑它,在 server { ... } 内、location ~ \.php$ 之前插入:
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
注意三点:
- 不用
if—— phpEnv 默认禁用if在 location 中,强行加会报nginx: [emerg] "if" directive is not allowed here - 必须用
try_files+&$args,否则带查询参数的 URL(如/user/list?page=2)会丢参 -
/index.php?s=$uri是 TP6 路由识别关键,s=参数不能省,也不能写成s=/$uri(开头多斜杠会导致 PATH_INFO 解析异常)
检查 fastcgi_param PATH_INFO 是否启用
即使 rewrite 正确,TP6 仍可能报 URL pathinfo not supported。打开 phpEnv 的 PHP-FPM 配置文件:D:/phpEnv/php/php-version/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 启动时依赖它扫描应用目录,禁用会导致白屏或 Call to undefined function think\scandir()。
验证 rewrite 是否真正生效
改完配置别急着测业务逻辑,先用最简方式验证请求是否进了 TP6 而非 Nginx 层:
- 访问一个明显不存在的路径,比如
http://localhost/xyz123—— 如果返回 TP6 自带的「页面不存在」蓝底错误页,说明 rewrite 成功、请求已进框架 - 如果返回 Nginx 默认 404(白色页),说明 rewrite 没触发,重点检查
try_files行位置是否在location ~ \.php$之前、root是否指向public目录 - 如果出现
rewrite or internal redirection cycle错误,查看 Nginx 错误日志:D:/phpEnv/nginx/logs/error.log,90% 是try_files第二项写了$uri/但目录真实不存在,导致反复重试
最易忽略的是 phpEnv 的 root 指令和 try_files 中路径的语义耦合——root 定义了物理起点,try_files 的 $uri 是相对这个起点计算的,差一级就全崩。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











