最直接有效的方式是用 location 规则拦截请求路径并把备份目录移出 Web 根目录:添加 location ^~ /backup/ { deny all; } 等前缀与精确匹配规则,确保优先级高;物理路径须置于 Web 根外(如 /data/backups/);补充独立日志、403 验证及避免被其他 location 覆盖。
最直接有效的方式是用 location 规则拦截请求路径,并把备份目录移出 Web 根目录——Nginx 本身不读取文件系统权限,只控制 HTTP 层访问,所以必须从 URI 入口堵住。
在 server 块中添加前缀匹配规则,确保优先级高、不被其他 location 覆盖:
location ^~ /backup/ { deny all; } —— 屏蔽所有以 /backup/ 开头的 URL(如 /backup/db.sql、/backup/logs/2024.log)location ^~ /backups/ { deny all; } —— 同理覆盖常见复数命名location = /backup.zip { deny all; } —— 精确匹配单个高频备份文件名~ .zip$ 这类后缀匹配,它可能漏掉 /backup/index.php?file=123 这类绕过方式很多泄漏源于目录放错位置。例如:
root /var/www/site; + 备份目录在 /var/www/site/backup/ → 即使没加 deny,只要 URL 能拼出来就可访问/data/backups/ 或 /var/backups/,这样即使配置遗漏,Nginx 默认也无法映射到该路径alias 指令是否意外指向了备份目录,例如 alias /var/www/site/backup/; 会直接暴露物理路径仅靠 deny all 不够,还需闭环验证和日志追踪:
access_log /var/log/nginx/denied_backup.log main;,便于发现扫描行为curl -I http://yoursite.com/backup/,确认返回 403 Forbidden
location ~ .php$ { ... } 若放在 deny 规则之后,可能导致 /backup/config.php 被误执行而非拒绝location ^~ /tmp/ { deny all; }、location ^~ /runtime/ { deny all; }