phpEnv中Laravel 404需改vhost配置:root指向public目录,location /用try_files $uri $uri/ /index.php?$query_string,PHP块加try_files $uri =404及正确SCRIPT_FILENAME。

phpEnv 是 Windows 下的集成环境(类似 XAMPP),它自带 Nginx,但默认不兼容 Laravel —— 直接放项目进去必 404,根源是 root 指向错 + try_files 缺失 + PHP 处理路径没对齐。
phpEnv 的 Nginx 配置文件在哪?怎么改?
phpEnv 的 Nginx 配置位于:C:\phpEnv\nginx\conf\vhost\(或 vhosts\),每个站点对应一个 .conf 文件,比如 laravel.conf。别去动 nginx.conf 主配置,只改 vhost 文件即可。
改之前先确认两件事:
- 你的 Laravel 项目放在哪?必须确保
root指向的是public目录,不是项目根目录。例如:项目在C:\www\myapp,那root就得写C:/www/myapp/public(注意斜杠方向,Windows 下用正斜杠更稳) - phpEnv 默认用的是
127.0.0.1:9000转发 PHP,所以fastcgi_pass必须匹配这个地址,不能照抄 Linux 的 socket 路径
location / 块里 try_files 怎么写才不丢参数?
这是最常出问题的地方:很多教程写 /index.php?$args 或 /index.php?/$1,在 phpEnv 上要么 500,要么 GET 参数(如 ?page=2)直接消失。
立即学习“PHP免费学习笔记(深入)”;
正确写法只有一条:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
关键点:
-
$query_string是 Nginx 内置变量,原样保留整个查询串,比$args更可靠 - 千万别加
if (!-e $request_filename)或rewrite规则 —— phpEnv 的 Nginx 版本较旧(通常 1.16–1.20),if在location里行为不稳定,极易导致重定向循环或 500 错误 - 这个
location /块必须放在location ~ \.php$之前,否则 PHP 文件请求会被先匹配到根 location,进不了 FastCGI
PHP 处理块(location ~ \.php$)要怎么配?
phpEnv 自带 PHP-FPM,监听 127.0.0.1:9000,但默认配置里常漏掉 SCRIPT_FILENAME,导致 $_SERVER['SCRIPT_FILENAME'] 是空的,Laravel 启动直接报错。
完整且安全的 PHP 块长这样:
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
注意三个细节:
-
try_files $uri =404:防止恶意请求/anything.php(实际不存在)被错误转发给 PHP 执行 -
$document_root$fastcgi_script_name:确保路径拼接正确;$document_root来自上面的root设置,必须和 public 目录一致 - 不要加
fastcgi_split_path_info—— Laravel 5.3+ 不依赖PATH_INFO,加了反而干扰路由解析
为什么改完还是 404 或空白页?优先检查这三处
不是所有 404 都是 Nginx 配置问题。phpEnv 环境下高频踩坑点:
-
.env里的APP_URL还是http://localhost?phpEnv 访问通常是http://127.0.0.1:8080或你设的端口,APP_URL必须完全匹配,否则生成的 URL(如密码重置链接)全是错的 - Nginx 配置改完没重载:phpEnv 界面右下角点「重启 Nginx」,或者命令行执行
C:\phpEnv\nginx\nginx.exe -s reload(不是-t测试就完事) - Laravel 的
storage和bootstrap/cache目录权限 —— Windows 下虽不严格,但如果用的是非管理员账户启动 phpEnv,这两个目录可能没写入权限,清缓存会失败,页面直接报Whoops
真正的难点不在规则本身,而在于 phpEnv 把 Nginx、PHP、Windows 路径、用户权限全混在一起,任何一个环节断链,表现都是“首页能打开,其他路由全 404”。盯住 error.log(在 C:\phpEnv\nginx\logs\ 下),比猜快十倍。



















