要让index.php优先于index.html被加载,需将DirectoryIndex指令设为DirectoryIndex index.php index.html index.htm,并确保mod_php已启用且.php后缀正确映射到PHP处理器。

Apache怎么让index.php优先于index.html被加载
Apache默认按DirectoryIndex指令中列出的文件名顺序查找索引页,常见配置是DirectoryIndex index.html index.php,这就导致即使目录下同时存在index.html和index.php,Apache也会先返回index.html。要让PHP文件优先,必须显式调整这个顺序。
- 修改
httpd.conf或站点对应的配置段中的DirectoryIndex指令 - 把
index.php放在最前面,例如:DirectoryIndex index.php index.html index.htm - 如果使用
.htaccess,确保AllowOverride Indexes(或All)已启用,否则该指令不生效 - 修改后必须重启Apache(
sudo systemctl restart httpd或sudo apachectl graceful),仅重载配置可能不触发索引顺序更新
注意:某些Linux发行版(如Ubuntu)的默认配置里index.php已被包含,但位置靠后;不要只加不调序,否则无效。
为什么加了index.php还是不解析——检查mod_php是否启用
即使DirectoryIndex已设为index.php,如果PHP模块未启用或未正确关联.php后缀,Apache会把index.php当作纯文本返回,甚至直接下载。
- 运行
httpd -M | grep php(CentOS/RHEL)或a2enmod php+apache2ctl -M | grep php(Debian/Ubuntu)确认php_module已加载 - 检查是否有
AddHandler或AddType配置将.php映射到PHP处理器,典型配置如下:AddHandler application/x-httpd-php .php
- 在较新版本Apache(2.4+)与PHP-FPM配合时,需用
SetHandler "proxy:fcgi://127.0.0.1:9000"替代AddHandler,且必须搭配ProxyFCGI模块 - 若用
FilesMatch包裹PHP处理逻辑,确保正则覆盖index.php(例如没问题,但太窄,不推荐)
多个PHP入口文件共存时如何控制解析优先级
有些项目需要支持index.php、home.php、default.php等作为可选索引页,又不想硬编码全部列在DirectoryIndex里。
立即学习“PHP免费学习笔记(深入)”;
-
DirectoryIndex支持任意数量参数,顺序即匹配顺序:DirectoryIndex index.php home.php default.php index.html - 不建议用通配符(如
DirectoryIndex .php),Apache不支持glob语法,会字面匹配文件名.php - 若需动态行为(比如根据Host或路径切换主入口),应改用
RewriteRule配合-f条件判断文件是否存在,再内部重写到目标PHP文件,例如:RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^$ /index.php [L] - 此类重写方式绕过
DirectoryIndex机制,适用于单页应用或路由驱动型框架,但会隐藏真实URL结构,调试时注意RewriteLog(旧版)或LogLevel alert rewrite:trace3(2.4+)
实际部署中,最常被忽略的是模块加载状态与DirectoryIndex作用域冲突——比如在块里覆盖了全局设置,却忘了检查该目录是否继承了上级的AllowOverride限制。











