autoindex on必须在匹配路径的location块内显式配置,否则因路径映射错误、权限缺失(尤其目录执行位)、上级配置覆盖或selinux限制而失效。

能配出来,但 90% 的失败不是因为不会写 autoindex on,而是路径、权限或继承关系出错。
location 块里必须显式写 autoindex on
autoindex 不会自动继承上级配置。即使你在 http 或 server 块写了 autoindex on,只要某个 location /files/ 里没重申,它就默认是 off。
- 正确写法:在匹配目标路径的
location内直接开启,例如location /downloads/ { autoindex on; alias /data/downloads/; } - 错误写法:只在
server块开头写一次,然后以为所有子路径都生效 - 注意覆盖:如果上级
location /里写了autoindex off,它会压制更具体的子路径,除非子路径里明确再写on
root 和 alias 别混用,路径拼接逻辑完全不同
写错会导致 403(权限拒绝)或 404(找不到目录),而你可能还在查 autoindex 有没有生效。
-
root /var/www;+location /files/→ 实际查找/var/www/files/(拼接) -
alias /var/www/files/;+location /files/→ 实际查找/var/www/files/(替换,注意末尾斜杠必须一致) - 用
alias时,location路径结尾带/,alias值也必须带;否则 Nginx 会多拼一个/,导致路径错位
中文文件名乱码、时间显示 GMT、大小全是字节?这些不是 bug,是缺配置
默认行为对生产环境不友好,但只需加几行就能修复:
-
charset utf-8;—— 必须加在location或server块里,否则中文文件名在浏览器里显示为%E4%BD%A0%E5%A5%BD这类编码 -
autoindex_localtime on;—— 否则时间显示为 UTC,比本地快 8 小时(CST) -
autoindex_exact_size off;—— 否则 1.2MB 文件显示成1258291字节,难读 -
autoindex_format html;—— 显式声明,避免某些旧版本或模块干扰下返回纯文本
访问 403?先检查三件事:权限、执行位、SELinux
Linux 下最常卡在这一步,Nginx 日志里只写 directory index of "/xxx/" is forbidden,但真正原因藏得深。
- Nginx 工作进程用户(如
www-data或nginx)必须对目标目录及其所有父目录都有x(执行)权限——这是进入目录的前提,不是可选项 - 运行
ls -ld /data/downloads/,确认输出中包含r-x(至少对组或其他用户),否则加:chmod o+x /data/downloads - 若系统启用了 SELinux(如 CentOS/RHEL),还需确认上下文允许:
ls -Z /data/downloads/应含httpd_sys_content_t;否则运行chcon -R -t httpd_sys_content_t /data/downloads/
真正麻烦的从来不是“怎么打开列表”,而是“为什么开了却看不到”——路径映射错、权限漏掉执行位、SELinux 拦截、上级配置覆盖,这四点占了全部失败案例的绝大多数。配完别急着 reload,先 nginx -t 看语法,再 curl -I http://localhost/files/ 看响应头有没有 Content-Type: text/html,最后才点开浏览器看效果。











