应显式关闭 autoindex 并配合 index、try_files 和路径拦截规则:autoindex off;为每个 location 明确设置 index;用 try_files 防 403;用 if ($uri ~ "\.\.") { return 403; } 拦截目录遍历;用 location ~ ^/(config|logs|backup|\.git|\.env) { return 403; } 拒绝敏感路径。

要避免用户通过访问目录路径(比如 /admin/ 或 /static/)直接看到后端目录结构,关键不是靠 index 指令“显示首页”,而是用它配合其他配置,**阻止 Nginx 返回目录列表或暴露文件路径**。单纯写 index index.html; 不足以防御——如果该目录下没有 index.html,又没关掉目录索引,Nginx 就会列出所有文件。
显式关闭 autoindex,杜绝目录列表
这是最基础、最关键的一步。即使默认是关闭的,也必须在每个可能暴露的 location 中显式禁用:
- 在
server块开头或全局http块中加:autoindex off; - 对静态资源路径单独强化,例如:
location /static/ {<br> root /var/www/app;<br> autoindex off;<br> index index.html;<br>} - 不要依赖默认值,尤其当配置被多层继承时,显式写才能确保生效
为每个目录明确设置 index 文件并控制 fallback
index 的作用是:当用户请求一个目录(如 / 或 /api/docs/)时,Nginx 按顺序查找指定文件;找到就返回,找不到且 autoindex off,就会返回 403 Forbidden(而不是列目录)。
- 把
index放在server或具体location块里,别放在http全局块——避免多个站点互相干扰 - 按实际需求排序,比如后台路径优先找
admin.html:index admin.html index.html; - 搭配
try_files防止“空目录”导致 403:try_files $uri $uri/ /index.html;,这样即使目录下没index.html,也会回退到单页入口,而不是暴露结构
拦截典型遍历路径,堵住 ../ 攻击入口
攻击者常构造 /..//..//etc/passwd 这类路径尝试越权读取。Nginx 本身会自动解码和规范化 URI,但主动拦截更稳妥:
- 在
server块靠前位置添加:if ($uri ~ "\.\.") { return 403; } - 注意这条规则必须放在所有正则
location(如location ~ \.php$)之前,否则可能被跳过 - 不推荐用
$request_uri匹配,因为含查询参数,容易误判;$uri是标准化后的路径,更准确
敏感目录直接拒绝访问,不给任何机会
对于明显不该被 Web 访问的路径(如 /config/、/logs/、/vendor/),干脆不让请求进入处理流程:
- 用正则 location 统一拦截:
location ~ ^/(config|logs|backup|\.git|\.env) { return 403; } - 这类规则建议放在
server块顶部,确保优先匹配 - 同时把真实敏感文件移出 Web 根目录(比如放到
/var/www/private/),从源头消除风险


















