nginx静态目录安全配置核心是禁用路径遍历:优先用alias而非root映射,关闭autoindex,用正则拦截../和//,配合try_files $uri =404兜底,并限制http方法及隐藏敏感头。

核心是让 Nginx 无法解析出超出指定目录的路径,关键在于用对 alias、禁用自动目录索引、并配合正则校验或 try_files 做兜底。
优先使用 alias 而非 root 映射静态目录
alias 是更安全的选择,它把 location 路径直接映射到文件系统某目录,不拼接 URI,天然规避遍历风险。而 root 会把请求路径追加到指定目录后形成完整路径,容易被 ../ 绕过。
- 推荐写法:
location ^~ /static/ { alias /var/www/assets/; }→ 请求/static/abc.png直接对应/var/www/assets/abc.png - 避免写法:
location /static/ { root /var/www; }→ 请求/static/../etc/passwd可能变成/var/www/../etc/passwd,存在风险 - 注意:
alias值末尾必须带斜杠,且 location 也应以/结尾,否则路径拼接会出错
关闭目录列表并禁止非法路径字符
即使路径拼接出问题,也要阻止用户看到目录结构或访问含危险字符的路径。
- 在对应 location 中加
autoindex off;,防止/static/返回目录列表 - 用正则匹配拒绝含
..或多个连续斜杠的请求:if ($request_uri ~ "\.\.|//") { return 403; } - 该规则需放在 location 内,且不能与
proxy_pass共存(Nginx 不允许 if + proxy_pass)
用 try_files 做路径合法性兜底
try_files 能强制只访问真实存在的文件,对不存在或解析异常的路径返回 404 或 403,比单纯依赖路径拼接更可靠。
- 示例:
location ^~ /static/ { alias /var/www/assets/; try_files $uri =404; } - 它先尝试按
$uri找文件,找不到就返回 404;不会继续向上层目录回溯 - 搭配
alias使用时,$uri已是映射后的实际路径,安全性更高
补充加固:限制 HTTP 方法和隐藏敏感头
静态资源通常只需 GET/HEAD,额外方法可能用于探测或攻击。
- 添加:
if ($request_method !~ ^(GET|HEAD)$) { return 405; } - 移除敏感响应头:
server_tokens off;(全局配置),避免泄露 Nginx 版本 - 确保文件系统权限合理:静态目录属主为
www-data(或 nginx 用户),权限设为755,文件为644,禁止写入











