DirectoryIndex 是什么?Apache 默认首页配置、优先级与安全关闭目录列表
把网站根目录一列,明明有 index.html,浏览器访问 https://example.com/ 却弹出目录文件列表,或者直接 403 Forbidden——这不是文件坏了,而是服务器没有把“目录请求”映射到某个默认文档。这条映射规则在 Apache 里由 DirectoryIndex 指令控制。本文讲清它的工作机制、配置位置、常见写法与踩坑点。

一、DirectoryIndex 到底做了什么
当请求的路径以斜杠结尾(GET /news/),服务器把它解析成磁盘上的一个目录。此时 Apache 会按 DirectoryIndex 后面列出的名称从左到右依次尝试,找到第一个存在的文件就返回它(并按该文件的类型设置 Content-Type);一个都找不到时,行为取决于是否启用 mod_autoindex:
- 启用了 autoindex → 输出目录清单(这就是很多人看到“Index of /”的原因);
- 没启用且权限禁止列表 → 返回
403 Forbidden。
官方定义见 httpd.apache.org/docs/2.4/mod/core.html#directoryindex。默认配置通常就是一行:DirectoryIndex index.html。
二、多个候选名与执行顺序
可以一次列多个,顺序即优先级:
DirectoryIndex index.php index.html index.htm default.html
三个细节:
- 只有存在的才会被选中。目录里同时有
index.php和index.html时,谁在指令里更靠左谁生效——这是 PHP 站点首页“莫名变白屏”的常见根因:index.php排前面但 PHP 模块没加载,返回了源码或 500。 - 名称里不能带路径。
DirectoryIndex a/index.html是无效写法,它只在当前目录内找文件。 - 可以带查询参数占位(少见),但一般不建议,SEO 上会造成重复内容。
三、配置能写在哪些位置
DirectoryIndex 的作用域是 server config, virtual host, directory, .htaccess,也就是四个层级都能写:
- 主配置
httpd.conf//etc/apache2/apache2.conf(全局生效); <VirtualHost>块内(按站点生效,多站点最常用);<Directory "/var/www/html">块内;- 目录下的
.htaccess—— 前提是上层有AllowOverride Indexes或AllowOverride All。共享主机里用.htaccess加一行DirectoryIndex home.php换首页,就是这个原理。
改完必须重载,且重载前一定先测语法:apachectl configtest(或 httpd -t)通过后再 systemctl reload httpd。Apache 是“配置错了直接起不来”,reload 会让线上中断,务必谨慎。
四、Nginx 与 IIS 的对应写法
这三个服务器的概念同名,指令不同:
- Nginx:用
index指令,写在http/server/location任意层,默认值是index.html index.htm。location / { index index.php index.html; try_files $uri $uri/ /index.php?$query_string; }
注意 Nginx 的index除了找文件,还有一个副作用:命中时会触发一次 301 重定向(/news/请求命中/news/index.php,Nginx 内部转成/news/index.php),这也是为什么 Nginx 下“访问目录”会看到 URL 变化。 - IIS:叫“默认文档(Default Document)”,在
web.config的<defaultDocument><files>集合里配置,可<clear />后重写顺序。ASP.NET 站点常把default.aspx、index.aspx排在前面。
五、目录列表的安全隐患与关闭方法
如果 DirectoryIndex 没生效又开了 autoindex,敏感目录(备份文件、上传目录、.git)会被整目录列出。两种处理:
- 关掉列表:
<Directory "/var/www/html"> Options -Indexes </Directory>,宁给 403 不给清单。 - 只放行特定目录:
<Directory "/var/www/html/docs"> Options +Indexes </Directory>,配合IndexOptions美化。
顺手检查是否存在无首页的上传目录,例如 curl -I https://你的域名/uploads/:返回 200 且有 X-Directory-Index 类特征就要警惕,返回 403 才是正常预期。
六、常见问题 FAQ
问:加了 DirectoryIndex 还是 403?
答:三步排查——(1) 文件是否真实存在且大小写一致(Linux 区分大小写,Index.html 不等于 index.html);(2) 属主/权限,Web 进程用户(www-data/apache)是否有读权限,SELinux 环境还要看 httpd_sys_content_t 上下文;(3) 上层是否有 Options -Indexes 且文件不存在。
问:访问 /admin/ 出现目录列表,怎么只给它换首页?
答:在该 <Directory> 或 .htaccess 里单独写 DirectoryIndex login.php,就近原则会覆盖全局配置。
问:为什么 index.php 变成了下载而不是执行?
答:不是 DirectoryIndex 的问题,而是 PHP 处理器没关联(缺 AddType application/x-httpd-php .php 或 php-fpm 的 SetHandler proxy:fcgi://127.0.0.1:9000)。DirectoryIndex 只负责“选中哪个文件”,不负责“怎么执行”。
问:SEO 上 index.html 和其它首页有区别吗?
答:https://a.com/、https://a.com/index.html、https://a.com/index.php 是三个不同 URL,会分散权重。规范做法是用 301 把带文件名的形式统一回根路径,并在页面里写 <link rel="canonical" href="https://a.com/">。
理解 DirectoryIndex 的关键一句话:它只是一张“按顺序点名”的清单。点名失败才会轮到目录列表或 403。因此遇到首页异常,先看清单顺序、再看文件是否存在、最后才怀疑模块。
生产内容,同时打通搜索引擎(SEO)与AI搜索引擎(GEO)流量入口的软件! 点击进入365建站器 »
