隐藏index.php需配置nginx伪静态:1. location /中用try_files $uri $uri/ /index.php?$query_string;2. location ~ \.php$中必须设置fastcgi_param path_info $fastcgi_path_info并确保script_filename正确指向。

PHPEnv下Nginx配置隐藏index.php的rewrite规则
PHPEnv默认用Apache,但切到Nginx后,Laravel、ThinkPHP等框架的URL会暴露index.php,比如http://test.local/index.php/user/login。这不是伪静态没生效,而是Nginx根本没把请求转发给index.php处理——必须显式配置try_files和location匹配逻辑。
核心是让Nginx在找不到真实文件/目录时,把请求甩给index.php,由PHP框架自己解析PATH_INFO。别直接复制网上“加个rewrite ^(.*)$ /index.php/$1 break;”——那在PHPEnv的Nginx里大概率500或404,因为没配fastcgi_param传递路径信息。
- 确保
nginx.conf中server块已启用include你项目的配置(如include vhost/test.local.conf;) - 在对应vhost配置里,
location /块必须包含:try_files $uri $uri/ /index.php?$query_string;
- 同时确认
location ~ \.php$块里有这行(缺了PATH_INFO就拿不到路由):fastcgi_param PATH_INFO $fastcgi_path_info;
- 如果用Laravel,还要补一句
fastcgi_split_path_info ^(.+\.php)(/.+)$;,否则$fastcgi_path_info为空
ThinkPHP 6/8在PHPEnv Nginx下重写失效的典型原因
ThinkPHP默认依赖PATH_INFO,但PHPEnv的Nginx+PHP-FPM组合常因fastcgi_param缺失或顺序错乱导致$_SERVER['PATH_INFO']为空,结果所有路由都进首页或报404。
- 检查
location ~ \.php$块中fastcgi_param SCRIPT_FILENAME是否指向正确的.php文件(常见错误:写成$document_root$fastcgi_script_name但$document_root没定义) - ThinkPHP 6+要求
fastcgi_param PATH_INFO必须在fastcgi_param SCRIPT_FILENAME之后设置,否则被覆盖 - Windows版PHPEnv用户特别注意:Nginx配置里的路径分隔符要用
/,别用\,否则$fastcgi_path_info解析失败 - 验证方法:建个
info.php,输出print_r($_SERVER),重点看PATH_INFO、REQUEST_URI、QUERY_STRING三项是否合理
PHPEnv切换Nginx后rewrite规则不生效的排查点
改完配置nginx -t && nginx -s reload没用?不是语法错,而是PHPEnv的Nginx服务没真正重启,或者配置没加载进当前worker进程。
- 执行
ps aux | grep nginx,确认master进程UID是www(PHPEnv默认),不是root——如果是root,说明你用nginx.exe双击启动了,得关掉再用PHPEnv面板启 - 查看Nginx错误日志:
C:\phpEnv\nginx\logs\error.log(Windows)或/usr/local/phpenv/nginx/logs/error.log(macOS/Linux),搜索rewrite or internal redirection cycle,那是try_files兜底写错了 - 浏览器F12看Network,点一个带参数的请求,Response Headers里有没有
X-Powered-By: PHP/...?没有说明请求根本没到PHP,还在Nginx层就被拦了 - PHPEnv面板里“Web服务器”切换按钮旁边有个“配置文件”链接,点开确认你改的是它指向的那个conf,不是自己新建的副本
Laravel项目在PHPEnv Nginx中访问/public子目录的问题
很多人把Laravel放到C:\phpEnv\www\myapp,然后访问http://myapp.local/myapp/public——这是错的。Nginx的root必须指向public目录,而不是项目根目录。
- 正确做法:在vhost配置里设
root C:/phpEnv/www/myapp/public;(Windows)或root /usr/local/phpenv/www/myapp/public;(macOS/Linux) - 删掉
location /里多余的alias或rewrite,只留try_files $uri $uri/ /index.php?$query_string; - 如果用Laravel Mix或Vite,前端资源路径要同步改
APP_URL=http://myapp.local,不然JS/CSS 404 - Windows用户注意:
root路径中的盘符C:后面必须跟/,不能写C:\,否则Nginx启动失败
PATH_INFO传递和root路径指向这两处,是PHPEnv+Nginx重写里最容易漏掉的硬性条件,改完不生效,八成卡在这儿。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











