Nginx 配置中应通过 if 正则拦截 ..、.%2e、// 等目录遍历特征,配合 try_files $uri =404 阻断空路径与目录暴露,禁用 autoindex,黑名单敏感路径前缀,并优先使用 root + try_files 替代 alias。

直接在 Nginx 配置中拦截含 ..、.%2e(即 URL 编码的点)、双斜杠 // 等典型目录遍历特征的请求,是最有效且低开销的第一道防线。这类规则不依赖后端,由 Nginx 在路由阶段就拒绝,既防泄露也减轻服务压力。
用 if + 正则匹配拒绝路径穿越字符
在 server 块顶层(或关键 location 外)添加如下规则,覆盖常见编码变体:
-
if ($uri ~ "\.\.") { return 403; }—— 拦截原始.. -
if ($request_uri ~ "(\.\.\/|\/\.\.|%2e%2e|\.%2e|\/%2e%2e)") { return 403; }—— 覆盖 URL 编码和混合写法 -
if ($uri ~ "//") { return 403; }—— 防止路径混淆绕过
注意:$uri 是解码后的标准化路径,$request_uri 是原始未解码请求串,两者配合可防大部分绕过。
结合 try_files 阻断“空路径”与目录暴露
仅靠拒绝还不够——若某 location 允许访问静态资源,需确保它不会因路径解析失败而回退到列目录或返回意外内容:
- 避免使用
autoindex on,始终显式设为autoindex off - 对静态资源 location,用
try_files $uri =404;替代裸root或alias,强制只响应确切存在的文件 - 示例安全配置:
location /assets/ {
root /var/www/site;
try_files $uri =404;
}
禁止访问敏感路径前缀(黑名单兜底)
即使没有目录遍历,直接请求 /.env、/config.php、/.git/ 也应立即拒绝:
- 在 server 块中加入统一拦截:
location ~ ^/(?:\.(?:git|env|htaccess)|config|backup|logs|phpmyadmin|owa) {
return 403;
} - 该规则必须放在通用
location ~ \.php$或location /之前,否则可能被覆盖 - 正则开头用
^/锚定,避免误杀正常路径中的子串
慎用 alias,优先 root + try_files
alias 是目录遍历高危区,尤其当末尾缺少斜杠时易被 ../ 绕过。能用 root 就不用 alias:
- ❌ 危险:
location /static { alias /data/files; }→/static../etc/passwd可能解析为/data/filesetc/passwd - ✅ 安全:
location /static/ { root /data; try_files $uri =404; }→ 请求必须以/static/开头,路径严格限定在/data/static/下


















