DirectoryIndex 指令仅在当前目录查找指定文件,不支持父目录路径(如 ../index.html)或绝对路径;可行方案包括符号链接、mod_rewrite 重写或 Alias 映射。

Apache 的 DirectoryIndex 指令不能指定位于父级目录(或上级路径)的文件作为默认索引页。
它只会在当前请求目录内查找所列出的文件名,按顺序匹配,且不支持路径遍历(如 ../index.html)或相对路径写法。这是由 Apache 的设计机制决定的:安全限制 + 语义明确性 —— 默认首页必须是该目录下的直接子文件。
✅ 正确行为(官方规则)
-
DirectoryIndex index.html home.php
→ Apache 仅在当前 URI 对应的目录下查找index.html,找不到再找home.php,不会跨目录搜索。 - 即使你写成
DirectoryIndex ../shared/index.html,Apache 会把它当作字面文件名去当前目录里找,结果就是找不到,继续下一个,最终可能返回 403 或触发目录列表(如果启用)。
❌ 常见误解与无效尝试
-
DirectoryIndex /var/www/common/index.html(绝对路径)→ 无效,指令只接受 basename(如index.html),不解析路径。 -
DirectoryIndex ../index.html→ 被当作普通文件名,实际查找的是当前目录下的..index.html(注意点号在开头),不是上层目录。 -
.htaccess中用DirectoryIndex指向父目录 → 同样不生效,作用域仍限于当前目录。
✅ 可行替代方案
1. 用符号链接(Symlink)
在目标目录中创建指向父目录公共首页的软链接:
ln -sf /var/www/shared/index.html /var/www/site1/index.html ln -sf /var/www/shared/index.html /var/www/site2/index.html
然后保持 DirectoryIndex index.html 不变。Apache 会正常读取 symlink 指向的内容(需确保 Options +FollowSymLinks 已启用)。
2. 用 mod_rewrite 内部重写
在 .htaccess 或虚拟主机配置中,对空请求路径重写到父目录文件:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d
RewriteCond %{REQUEST_FILENAME}/index.html !-f
RewriteRule ^$ /shared/index.html [L]⚠️ 注意:这要求 /shared/index.html 在 DocumentRoot 下可访问(如 DocumentRoot 是 /var/www,则 /shared/ 必须是其子路径),且 mod_rewrite 已启用。
3. 统一 DocumentRoot 或 Alias 映射
把公共首页所在目录设为所有站点共用的根下子目录,并通过 Alias 或调整 DocumentRoot 结构来共享:
Alias /common /var/www/shared
<Directory "/var/www/shared">
Require all granted
</Directory>再配合 rewrite 或前端路由跳转,但本质仍是让文件落在可被 DirectoryIndex 扫描的路径范围内。
⚠️ 安全提醒
- 不要试图用
../绕过目录隔离,Apache 明确禁止这种路径回溯用于DirectoryIndex,是防止路径遍历攻击的关键防线。 - 若真需多站点复用同一首页,推荐用 symlinks 或构建构建时复制(CI/CD 场景),而非运行时动态引用。
不复杂但容易忽略。

















