Nginx 用 location 限制目录访问需精准匹配路径并配置 allow/deny 规则:推荐 location ^~ /admin/,内部按序写 allow/deny 且以 deny all; 结尾;敏感目录可用 internal 隐藏,修改后须 nginx -t 验证再 reload。

用 location 限制特定目录的访问权限,核心是两件事:一是让 Nginx 正确匹配到那个目录路径,二是在这个匹配块里施加访问控制逻辑。它不改文件系统权限,而是拦截 HTTP 请求层的访问。
用 ^~ 精准匹配目录路径
推荐使用 location ^~ /admin/ 这类前缀匹配方式,避免正则干扰,也防止被其他 location 覆盖:
-
^~ /admin/:匹配所有以
/admin/开头的请求,优先级高,匹配后不再检查正则 location - 别用
location /admin(缺末尾斜杠),它会误匹配/administer或/admin-api - 若需完全精确,比如只限
/backup这个 URI,用 location = /backup
在 location 内配置 allow/deny 规则
规则必须写在对应 location 块内部,且顺序决定结果——先匹配的 rule 生效,后续忽略:
- 允许指定 IP:
allow 192.168.2.5; - 允许整个网段:
allow 10.0.0.0/8; - 拒绝某个恶意地址:
deny 203.0.113.99; - 收尾必须是
deny all;,否则没写到的 IP 默认放行
示例(仅允许运维网段访问后台):
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
allow 172.16.0.0/12;
allow 203.0.113.42;
deny all;
}
禁止直接访问敏感目录(返回 404 更安全)
单纯 deny all 会暴露目录存在。想“隐身”,用 internal 指令:
-
location ~* ^/(conf|private|secrets)/ { internal; }:外部请求全部 404,只有内部 rewrite 或 proxy_pass 才能命中 - 搭配隐藏文件规则更稳妥:
location ~ /\. { deny all; }阻止 .git、.env 等被下载
验证与注意事项
改完配置不能直接 reload,要走标准流程:
- 运行
nginx -t确认语法无误 - 执行
nginx -s reload或systemctl reload nginx - 从被禁 IP 访问测试路径,应返回 403 或 404;从白名单 IP 访问应正常加载
- 如果前端有 CDN 或代理,
$remote_addr是代理 IP,需配合set_real_ip_from和real_ip_header获取真实客户端 IP










