✅ 精确匹配 location = 可彻底规避路径遍历:它跳过 uri 归一化,仅字面等值判断,不处理 //、../ 或 url 编码;配合 if 拦截双斜杠与 %2f/%5c、alias 尾斜杠对齐、root 优先、try_files $uri =404 兜底,构建纵深防御。

直接用 location = 精确匹配 + 严格尾斜杠规范,就能堵死 // 绕过路径审计的入口。关键不是“加不加斜杠”,而是让 Nginx 在最开始就拒绝任何非预期格式的 URI,不给后续解析留机会。
用精确匹配(location =)锁死合法访问路径
攻击者常利用双斜杠(如 /static//../etc/passwd)触发 Nginx 内部路径规范化异常,绕过基于正则或前缀匹配的过滤逻辑。而 location = 是 Nginx 中唯一完全跳过 URI 重写和路径归一化阶段的匹配方式——它只做字面等值判断,不处理编码、不展开 ../、不合并重复斜杠。
- ✅ 正确示例:
location = /static/ { root /var/www/; }→ 只响应 且仅响应 字符串完全等于/static/的请求 - ❌ 错误示例:
location /static/ { ... }或location ~ ^/static/ { ... }→ 都会进入常规 URI 处理流程,可能被 // 或 %2f%2f 触发解析歧义
强制统一 URI 格式,提前拦截非法变形
即便用了精确匹配,用户仍可能发送 /static// 或 /static/%2f%2f。这时需在 server 块顶层用 if + return 400 主动拒绝:
- 禁止连续斜杠:
if ($request_uri ~ "//") { return 400; } - 禁止 URL 编码斜杠:
if ($request_uri ~ "%2f|%5c") { return 400; }(覆盖/和\的常见编码) - 注意:
if在 location 块内慎用,应放在 server 上下文中,且仅用于简单字符串判断
别名(alias)必须与 location 尾斜杠严格一致
如果必须用 alias(例如对接上传目录),location 和 alias 的斜杠状态必须完全对齐,否则 Nginx 会错误拼接路径:
- ✅ 安全写法:
location /static/ { alias /var/www/static/; }(两者都有尾斜杠) - ❌ 危险写法:
location /static/ { alias /var/www/static; }(alias 缺尾斜杠)→ 请求/static//test.txt可能被解析为/var/www/static/test.txt,跳过校验 - 更稳妥的做法是优先用
root:它天然规避拼接风险,location /static/ { root /var/www/; }比 alias 更可控
配合 try_files 做最终兜底验证
即使前面都配置正确,也要防止攻击者利用文件系统特性(如符号链接)逃逸。在静态资源 location 中显式使用 try_files,强制要求目标文件真实存在于指定目录内:
location /static/ { root /var/www/; try_files $uri =404; }-
try_files会实际检查文件是否存在,并只在真实存在时返回;若路径被篡改后指向外部,Nginx 查不到文件,直接返回 404,不会尝试向上回溯 - 避免使用
autoindex on,它会暴露目录结构,为遍历提供线索











