Apache:如何显示目录列表

要在 Apache HTTP 服务器上显示目录中的文件和子目录列表,请在该目录中设置 Options +Indexes。只有在授予访问权限、不存在默认索引文件并且启用 mod_autoindex 时,才会生成该列表。

显示列表的条件

当在 Apache 2.4 中请求目录 URL 时,它首先查找 DirectoryIndex 中指定的文件。例如,如果 index.html 存在,通常会显示该文件。如果文件不存在并且 Indexes 已启用,则 mod_autoindex 可以创建列表。有关详细行为,请参阅 Apache 的 DirectoryIndex 描述 以及 mod_autoindex 文档。

列表设置不会授予访问权限。被拒绝访问的目录或 Apache 无法读取的路径将不会显示列表。此外,由于各种原因(例如身份验证或文件系统权限),也可能会发生 403 禁止访问,因此您不应仅因为出现 403 就启用列表。

设置前请检查

  • 准备一个专用目录,用于公开列表和文件。不要放置不应公开的材料,例如配置文件、备份或个人信息。
  • 确认要配置的网站的虚拟主机和实际文件路径。下面的示例适用于 Ubuntu Apache 2.4,当网站的文档根路径为 /var/www/html,且其下有公共目录 downloads。请替换为实际的环境路径和 URL。
  • 备份现有设置,并确认您有权限管理该网站并重新加载 Apache。如果是生产服务器,请先在测试环境中进行检查。

即使文件没有出现在列表中,如果你直接知道文件的 URL,也可能可以访问。将名称隐藏在列表中不能替代阻止文件访问的权限。

应用于虚拟主机中的特定目录

在 Ubuntu 上,活动站点配置通常在 /etc/apache2/sites-available/ 下的一个文件中。在站点的虚拟主机配置中添加以下块,或者修改现有的路径配置。不要轻易为已经有访问限制的目录添加公开权限。

<Directory "/var/www/html/downloads">
    Options +Indexes
    Require all granted
</Directory>

Options +Indexes 在继承的选项中启用目录列表。Require all granted 允许访问此路径,因此仅在打算公开的目录中使用它。实际的应用范围可能会根据其他配置部分或子目录设置而有所不同。您可以查看 Apache 选项指令 中的继承和合并规则。

保存配置后,请在 Ubuntu 上检查语法。如果显示 Syntax OK,请重新加载配置。如果发生错误,请纠正路径和拼写错误,并在检查成功之前不要重新加载。

sudo apache2ctl configtest
sudo systemctl reload apache2

除 Ubuntu 之外的发行版可能具有不同的配置文件位置和服务名称。同时,请遵循该发行版关于语法检查和重新加载命令的指导。

检查目录列表和访问范围

  1. 在目标目录中放置一个可以公开访问的测试文件,并确保指定的索引文件不存在。
  2. 在浏览器中打开目录的URL。在上面的例子中,如果服务器地址是https://example.com,则https://example.com/downloads/将是示例URL。用实际域名替换它。
  3. 检查测试文件是否显示在列表中,并打开链接以确保访问范围与预期设置匹配。由于设置可能会被子目录继承,因此也要检查公共访问范围。

如果页面显示出来而不是列表,请检查是否存在 DirectoryIndex 文件或其他处理程序/重定向。如果出现 403 错误,请检查错误日志中的访问限制、目录权限和索引设置。您还可以使用 apache2ctl -M 检查 autoindex 模块是否处于活动状态。如果路径不正确,可能会发生 404 错误。

使用 .htaccess 时

如果服务器管理员允许在目录的 .htaccess 中更改 Options,您也可以将以下行添加到该文件中。如果父级设置的 AllowOverride 不允许此选项,则可能不起作用或导致服务器错误,因此请与管理员确认。

Options +Indexes

如果您可以访问服务器设置,Apache 通常建议使用主配置文件。请查看 Apache 的 .htaccess 指南 中的适用条件。

停止显示列表

在给定路径中设置 Options -Indexes 或恢复更改前的设置,然后检查语法并重新加载 Apache。如果您将其添加到 .htaccess,请删除该行,或者在允许的情况下,将其更改为 Options -Indexes。由于可能存在继承的设置,修改后请再次检查目录 URL。

仅关闭列表并不会阻止已知文件 URL 的访问。要保护文件本身,请应用单独的访问控制,并验证未授权用户确实被阻止。