最稳妥做法是用location ^~ /backup/ { deny all; }等规则精准屏蔽uri路径,并将备份临时目录移至web根目录外;需检查root/alias避免意外暴露,重启后用curl验证返回403。

直接禁止外部访问系统备份与临时目录是最稳妥的做法,Nginx 本身不处理文件系统权限,但可以通过 location 规则拦截 HTTP 请求,防止敏感目录被意外暴露或恶意探测。
明确要保护的目录路径
先确认你的备份和临时目录实际位置,例如:
- 备份目录:
/var/www/example.com/backup/、/data/backups/ - 临时目录:
/tmp/(通常不应由 Web 服务直接提供)、/var/www/example.com/tmp/、/runtime/
注意:Nginx 的限制基于 URI 路径匹配,不是文件系统路径。需确保这些目录没有被 alias 或 root 指向为可公开访问的 location。
用 location + deny all 精准屏蔽
在 server 块中添加显式 location 规则,匹配 URL 路径并拒绝所有请求:
location ^~ /backup/ {
deny all;
}
location ^~ /tmp/ {
deny all;
}
location ^~ /runtime/ {
deny all;
}
location = /config.php {
deny all;
}
说明:
-
^~表示前缀匹配且优先于正则,适合目录路径,性能好、意图清晰 -
=用于精确匹配单个敏感文件(如配置文件) - 避免使用
location ~ \.php$ { ... }类规则去“过滤”,那属于执行控制,不是路径屏蔽
检查 root 和 alias 是否意外暴露了物理路径
常见错误是把备份目录放在 web 根目录下,又没加限制,比如:
root /var/www/example.com; # 此时 /backup/ 就对应 /var/www/example.com/backup/ —— 必须显式 deny
更安全的做法是:把备份和临时目录放在 web 根目录之外,例如:
-
/data/backups/(不在 /var/www 下) /var/backups/
这样即使漏写 location 规则,Nginx 默认也无法访问(除非你主动用 alias 指向它)。
补充建议:日志与验证
添加日志记录被拦截的请求,便于审计:
location ^~ /backup/ {
deny all;
access_log /var/log/nginx/denied_backup_access.log main;
}
验证是否生效:
- 重启 Nginx:
nginx -t && systemctl reload nginx - 用 curl 测试:
curl -I http://yoursite.com/backup/db.sql应返回403 Forbidden - 检查 Nginx 错误日志,确认无 “directory index of … is forbidden” 类警告(说明未被正确拦截)











