phpEnv伪静态按钮无效,因其将Apache风格RewriteRule硬塞入Nginx全局http块,语法错误且未适配TP5/TP6的PATH_INFO或s参数路由需求,须手动配置server块内location规则并确保root指向public目录。

phpEnv 本身不支持伪静态,必须手动改 Nginx 配置文件才能跑 TP5/TP6 —— 它的“伪静态开关”只是个假按钮,点了没用。
为什么 phpEnv 的伪静态按钮无效
phpEnv 是基于 Windows 的集成环境,界面里有个「伪静态」开关,但实际只是往 nginx.conf 里硬塞一段固定规则(通常是 Apache 风格的 RewriteRule),而 Nginx 根本不认这种写法。点开它生成的配置,你会发现:
- 规则被错误地塞进
http{}全局块,而不是具体的server{}块内 - 用了
RewriteRule这种 Apache 语法,Nginx 解析直接报错(unknown directive "rewriterule") - 没处理
PATH_INFO传递,TP6 的/index/index路由必然 404
手动配 Nginx 才能真正启用 TP6 路由
打开 phpEnv 安装目录下的 phpEnv\nginx\conf\vhost\你的站点.conf,在 server{} 块里、location ~ \.php$ 之前插入以下内容:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
注意三点:
-
last不能换成break,否则重写后不会重新匹配 PHP location,/index.php?s=xxx就进不了 FastCGI - 必须放在
location ~ \.php$之前,否则 PHP 文件优先匹配,rewrite 根本不触发 - 确认
root指向的是项目public/目录,不是整个 ThinkPHP 项目根目录
TP5 和 TP6 的 PATH_INFO 处理差异
TP5 默认依赖 PATH_INFO,TP6 默认走 s= 参数,但两者都可能 fallback 到 PATH_INFO。如果你发现 /index/index 仍 404,检查 Nginx 的 PHP 处理块里有没有这两行:
fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info;
没有就加上;有但被注释了就取消注释。另外,TP6 启动时会尝试用 putenv() 设置 PATH_INFO,所以宝塔或 phpEnv 的 PHP 禁用函数列表里,putenv 和 ini_set 必须放开。
runtime 权限和 public 目录位置是隐形雷区
Windows 下权限问题不明显,但 phpEnv 默认把整个项目放 www 目录下,容易导致 config/、application/ 被直接 HTTP 访问。务必做到:
- Nginx 的
root指向your-project/public/,不是your-project/ -
runtime/目录右键 → 属性 → 安全 → 给IIS_IUSRS或Users组「修改」权限(等效于 Linux 的 775) - 别信 phpEnv 自带的「一键部署」,它大概率把
index.php放错位置,导致SCRIPT_NAME解析错乱,URL 变成/index.php/index/index这种非 SEO 友好形式
最稳的做法:删掉 phpEnv 自动生成的站点配置,手写一份干净的 server 块,只保留 root、index、location /、location ~ \.php$ 四段,其他全删。多一行动态设置,就多一个出问题的环节。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











