Nginx 报 403 "Directory index is forbidden" 怎么办?

Nginx 403 Directory index is forbidden 的含义与两种修法:配 index 指令指定默认首页,或 autoindex on 开启目录列表;附权限检查与安全提醒、FAQ。

最佳实践
Nginx 报 403 "Directory index is forbidden" 怎么办?封面

这个错误的意思是:请求打到的是一个目录,Nginx 想找默认首页(index.html 等)没找到,而目录列表功能(autoindex)又没开——于是拒绝访问。 对症下药两条路:给目录配默认文件,或明确开启目录列表。

先理解错误的触发逻辑

请求 http://site/downloads/(注意结尾是目录)时,Nginx 的处理顺序:

  1. index 指令列出的默认文件(默认只有 index.html)→ 找到就返回;
  2. 找不到 → 看 autoindex 是否开启 → 开着就列目录;
  3. 都没戏 → 403 "directory index of ... is forbidden"

修法一:配置正确的 index 文件

目录里其实有首页,只是名字不在默认清单里(比如 index.phphome.html):

location / {
    index index.php index.html index.htm;
}

index 按顺序尝试,前面的优先。PHP 站点常见的坑:目录里明明有 index.php,但 server 块只写了 index index.html

修法二:确实要列目录,开 autoindex

下载站、文件共享这类故意要展示目录的场景:

location /downloads/ {
    autoindex on;                # 开目录列表
    autoindex_exact_size off;    # 文件大小显示为 K/M/G 而非字节
    autoindex_localtime on;      # 时间用服务器本地时区
}

⚠️ 安全提醒:只对确定要公开的目录开 autoindex。开错了等于把目录结构全盘暴露,源码备份、配置文件都可能被摸走。

修法三:检查文件系统权限

index 文件存在但仍 403,那就是权限问题:

ls -la /var/www/site/          # index.html 在不在?权限对不对?
namei -l /var/www/site/index.html   # 逐级检查路径上每个目录的执行权限

要求:文件对 Nginx 用户(www-data/nginx)可读,路径上每一级目录都要有执行(x)权限。

观测云对照

403 类错误往往静默发生——用户看到空白页就走人,运维毫无感知。把 Nginx 访问日志接入观测云,在日志查看器里按 status=403 聚合 URI,哪些路径在批量 403 立刻浮现;对 403 比例突增配监控告警,配置改坏、权限被误动都能在用户投诉前发现。

常见问题(FAQ)

Q:浏览器看到 403,curl 也是 403,但文件明明在?
A:先 namei -l 查路径权限链,再看是否开了 SELinux(getenforce)——SELinux enforcing 模式下即使文件权限对,httpd_sys_content_t 上下文不对照样 403。

Q:只想隐藏目录列表但保留文件直链访问?
A:默认就是这样——不开 autoindex 时目录请求 403,但直接请求 /downloads/file.zip 这种具体文件不受影响。

Q:index 指令在 location 里写了却不生效?
A:index 在 server 和 location 都能设,location 里的优先。用 nginx -T 看最终生效配置,确认没有被内层 location 覆盖。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台