phpEnv 默认首页顺序由 Apache 的 DirectoryIndex 指令决定,默认为 index.html index.htm index.php,因此优先加载 index.html;修改需调整该指令顺序并重启 Apache,且注意配置文件生效层级与框架根目录设置。

phpEnv 的默认首页顺序由 Apache 的 DirectoryIndex 决定
phpEnv 本质是封装了 Apache + PHP 的本地开发环境,它不额外定义索引逻辑,而是直接沿用 Apache 的 DirectoryIndex 指令。也就是说,你看到的“先加载 index.html 还是 index.php”,完全取决于 Apache 配置里这行怎么写。
默认情况下,phpEnv 安装后 Apache 的配置通常为:DirectoryIndex index.html index.htm index.php。这意味着即使目录下同时存在 index.php 和 index.html,浏览器访问 http://localhost/ 也会返回 index.html —— 不是因为 phpEnv 特别设计,而是 Apache 就这么配的。
- 修改位置在 Apache 主配置文件或站点对应的
vhost文件中(路径类似D:\phpEnv\Apache24\conf\httpd.conf或D:\phpEnv\Apache24\conf\vhost\your-site.conf) - 找到以
DirectoryIndex开头的行,把index.php移到最前面,例如:DirectoryIndex index.php index.html index.htm - 改完必须重启 Apache 服务(不是重载),phpEnv 界面点「重启 Apache」或命令行执行
httpd -k restart) - 若该站点根目录下有
.htaccess,且其中也含DirectoryIndex,则以.htaccess为准(需确保AllowOverride All已启用)
为什么改了 DirectoryIndex 还是加载 index.html?
常见原因不是配置没生效,而是以下三点之一:
-
index.php文件确实不存在于当前访问目录(注意大小写、扩展名是否为 .php 而非 .PHP 或 .php5) - Apache 的
mod_php模块未启用,或.php后缀未正确绑定处理器,导致 Apache 把index.php当作纯文本返回(检查响应头Content-Type: text/html是否出现 PHP 代码原样) - 你改的是错误的配置文件——比如改了
httpd.conf,但 phpEnv 实际加载的是vhost目录下的独立虚拟主机配置,后者会覆盖前者
验证方式:在浏览器打开 http://localhost/phpinfo.php(若存在),看 Loaded Modules 是否含 php_module;再访问 http://localhost/index.php 明确路径,排除 DirectoryIndex 干扰。
立即学习“PHP免费学习笔记(深入)”;
phpEnv 中 ThinkPHP8 等框架要求 public 为根目录,index.php 顺序反而不重要
像 ThinkPHP8、Laravel 这类现代 PHP 框架,实际入口是 public/index.php,而项目根目录(含 app/、config/)必须对外不可访问。此时你不能靠调整 DirectoryIndex 让框架跑起来,而要改 phpEnv 的「网站根目录」指向 public 子目录。
- 在 phpEnv 界面右键站点 → 「编辑站点」→ 把「网站目录」从
D:\phpEnv\www\myapp改成D:\phpEnv\www\myapp\public - 确保
public下有index.php,且该文件能正常执行(可临时加echo 'ok';die;测试) - 此时
DirectoryIndex只影响public/目录下的默认文件,只要public/index.php存在,它就一定会被优先加载 - 不需要在
public/里放index.html,否则反而可能干扰
子目录想用自己独立的 index.php 当入口?得靠 RewriteRule,不是 DirectoryIndex
DirectoryIndex 只管「访问目录时显示哪个文件」,它不会接管 /items/list 这种路径。如果你希望 /items/ 下所有请求(包括不存在的路径)都由 items/index.php 处理,必须用 Apache 的重写规则。
- 规则必须写在网站根目录(不是
items/目录)的.htaccess中,且开启RewriteEngine On - 典型写法:
RewriteRule ^items/(.*)$ items/index.php [L](匹配/items/开头的所有路径) -
items/index.php内需手动解析原始 URI:$path = $_SERVER['REQUEST_URI']或用parse_url()提取路径段 - 注意:此方案与
DirectoryIndex无关,也不依赖其顺序;哪怕DirectoryIndex是index.html,只要重写规则命中,就根本不会走到那一步
DirectoryIndex 的作用范围很窄,只解决「空路径 /」该返回谁;真正复杂的路由分发,从来不是它该干的活。



















