Nginx 防御目录遍历攻击需在 server 块顶层用 if 拦截 ..、编码变体及双斜杠,配合 root + try_files、禁用 autoindex、屏蔽敏感路径前缀,并将敏感文件移出 Web 根目录且限制权限。

在 Nginx 中防御目录遍历攻击,关键不是“事后过滤”,而是从路径解析源头切断越界可能——让非法请求根本无法进入文件系统查找环节。
立即拦截路径穿越字符
在 server 块顶层(不在任何 location 内)添加以下规则,利用 Nginx 的早期匹配机制直接拒绝:
-
if ($uri ~ "\.\.") { return 403; }—— 拦截解码后含..的标准化路径 -
if ($request_uri ~ "(\.\.\/|\/\.\.|%2e%2e|\.%2e|\/%2e%2e)") { return 403; }—— 覆盖 URL 编码变体和混合写法 -
if ($uri ~ "//") { return 403; }—— 防止双斜杠干扰路径归一化
注意:$uri 是解码并标准化后的路径,$request_uri 是原始请求串,两者配合能防大多数绕过手法。
静态资源访问必须用 root + try_files
避免使用 alias,尤其末尾不带 / 的配置极易被 ../ 绕过。正确做法是:
- 用
root指向父目录,路径匹配以/结尾,例如:location /static/ { root /var/www; } - 强制搭配
try_files $uri =404;,确保只响应真实存在的文件,不回退、不列目录 - 绝对禁用
autoindex on;,所有 location 显式写autoindex off;
统一屏蔽敏感路径前缀
在 server 块靠前位置(必须在通用 location ~ \.php$ 等之前)加入黑名单:
location ~ ^/(?:\.(?:git|env|htaccess)|config|backup|logs|phpmyadmin|owa) { return 403; }
正则以 ^/ 开头锚定,防止误杀正常路径中的子串;覆盖常见敏感文件与目录名。
加固基础环境
防御不止于配置,还需配合系统层控制:
- 将真正敏感的文件(如
.env、上传原始文件)移出 Web 根目录,放在/var/www/private/这类不可通过 URL 直接访问的位置 - Nginx 进程用户(如
www-data)对非公开目录应无读取权限:chmod 750 /var/www/private - 关闭响应头版本信息:
server_tokens off;,减少攻击者可利用的指纹


















