核心是用 root + try_files 替代 alias,并配合路径校验与显式拒绝规则:location 必须以斜杠结尾,root 末尾不加斜杠,搭配 try_files $uri =404;统一禁用 autoindex;前置 if 拦截 ../;顶部 location 黑名单阻断 .git、.env 等敏感路径。

核心是用 root + try_files 替代 alias,并配合路径校验与显式拒绝规则。alias 指令不校验路径合法性,容易被 ../ 绕过;而 root 搭配 try_files 能严格限定物理路径范围,并只响应真实存在的文件。
用 root + try_files 锁死访问范围
这是最根本的防御手段:
- location 必须以斜杠结尾,例如
location /static/ { ... },不能写成/static - root 值末尾不加斜杠,例如
root /var/www;,不是/var/www/ - 必须搭配
try_files $uri =404;,确保只返回真实文件,不回退、不列目录、不拼接非法路径 - 这样请求
/static/../etc/passwd会被解析为/var/www/static/../etc/passwd,但因$uri对应的路径在文件系统中不存在,直接返回 404,不会穿透
显式禁用目录索引和自动解析
防止攻击者通过目录列表或模糊匹配获取结构信息:
- 在 server 或 http 块中统一设置
autoindex off;,不要依赖默认值 - 所有静态资源 location 内也显式写上
autoindex off;,避免继承异常 - 避免使用
index index.html;等可能触发隐式行为的指令,除非明确需要
拦截含 ../ 的恶意路径
作为补充防线,主动识别并阻断典型遍历特征:
- 在 server 块靠前位置添加:
if ($request_uri ~ "(\.\.\/)+") { return 403; } - 也可用更宽松但覆盖更全的写法:
if ($uri ~ "\.\.") { return 403; } - 注意:该 if 必须放在通用正则 location(如
location ~ \.php$)之前,否则可能被跳过
屏蔽常见敏感路径前缀
即使没有路径遍历,直接请求敏感路径也需兜底拦截:
- 在 server 块顶部(早于所有其他 location)加入黑名单规则:
location ~ ^/(?:\.(?:git|env|htaccess)|config|backup|logs|phpmyadmin|owa) { return 403; }- 正则以
^/锚定开头,避免误杀正常路径中的子串(如/api/config/v1不会命中) - 覆盖
.git/、.env、/config/等高频泄露点


















