directoryindex 指令仅在用户请求目录路径且未指定文件时,按顺序查找并执行(或返回)列表中首个存在的默认文件,如 dashboard.php;它不重定向、不处理不存在的目录、仅对允许访问的 get 请求生效。

DirectoryIndex 指令本身不执行脚本,它只指定 Apache 在访问目录时优先查找并返回的**静态或可执行的默认文件**。要让用户访问目录时“自动执行特定脚本”,本质是把该脚本设为目录的默认索引文件,并确保服务器能正确解析它(如 PHP 脚本需启用 PHP 模块)。这不是重写或跳转,而是直接响应请求。
明确 DirectoryIndex 的作用范围
DirectoryIndex 仅影响当用户请求一个**目录路径**(如 /items/ 或 /blog/)且该路径下没有显式指定文件时的行为。Apache 会按顺序检查列表中的文件名,找到第一个存在的就直接返回(或执行)它。
- 它不改变 URL,也不触发重定向;用户地址栏仍显示目录路径
- 它不处理不存在的路径——如果整个目录都不存在,会返回 404,DirectoryIndex 不生效
- 它只对
GET请求有效,且前提是该目录被允许访问(Require规则放行)
配置 DirectoryIndex 执行 PHP 脚本(最常用场景)
假设你想让用户访问 https://example.com/admin/ 时自动运行 dashboard.php,而不是显示目录列表或报错:
- 确保
dashboard.php真实存在于/var/www/example.com/admin/目录下 - 在对应虚拟主机配置中(
<virtualhost></virtualhost>内),添加或修改 DirectoryIndex 行:
DirectoryIndex dashboard.php index.php index.html
这样 Apache 会按顺序查找:dashboard.php → 存在,就执行它;若不存在,再找 index.php,以此类推。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
⚠️ 注意:PHP 脚本能被执行,依赖于服务器已加载 libphp 或使用 php-fpm,且该目录的 Options 允许执行(如 +ExecCGI 对 CGI 有效,但 PHP 通常靠模块处理,无需额外开 ExecCGI)。
配合 Options 和 Require 保障安全执行
仅设 DirectoryIndex 不够,还需确保目录有基本执行权限和安全约束:
-
Options +FollowSymLinks -Indexes:允许符号链接,但禁止目录列表(防止暴露结构) -
AllowOverride None:禁用 .htaccess,避免被覆盖(除非你明确需要) -
Require all granted:放行合法请求(或更严格地限制 IP) - 若脚本含敏感操作(如后台),建议额外加身份验证,例如:
Require ldap-group cn=admins,ou=groups,dc=example,dc=com
不推荐但可行的替代思路:用 RewriteRule “伪装”执行
如果你无法修改 DirectoryIndex(比如共享主机限制),又希望访问 /api/ 时实际运行 /scripts/router.php,可用 mod_rewrite 实现内部重写:
RewriteEngine On<br>RewriteCond %{REQUEST_FILENAME} -d<br>RewriteRule ^api/$ /scripts/router.php [L]
这属于 URL 映射,不是 DirectoryIndex 的本意,但效果类似。注意它不改变 DirectoryIndex 行为,且需确保 router.php 有执行权限、路径正确、且未被 <filesmatch></filesmatch> 拦截。










