Nginx 报 403 "Directory index is forbidden" 怎么办?
Nginx 403 Directory index is forbidden 的含义与两种修法:配 index 指令指定默认首页,或 autoindex on 开启目录列表;附权限检查与安全提醒、FAQ。
这个错误的意思是:请求打到的是一个目录,Nginx 想找默认首页(index.html 等)没找到,而目录列表功能(autoindex)又没开——于是拒绝访问。 对症下药两条路:给目录配默认文件,或明确开启目录列表。
先理解错误的触发逻辑
请求 http://site/downloads/(注意结尾是目录)时,Nginx 的处理顺序:
- 找
index指令列出的默认文件(默认只有index.html)→ 找到就返回; - 找不到 → 看
autoindex是否开启 → 开着就列目录; - 都没戏 → 403 "directory index of ... is forbidden"。
修法一:配置正确的 index 文件
目录里其实有首页,只是名字不在默认清单里(比如 index.php、home.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 覆盖。