nginx中对特定路径的ip访问控制必须在location块内按“先allow后deny all”顺序配置,且需确保路径匹配准确(如用^~ /admin/)、代理环境下还原真实ip;否则规则失效。

在 Nginx 中,可以通过 location 块结合 allow/deny 指令,对特定 URL 路径做 IP 访问控制。关键在于:指令必须放在允许生效的上下文中(如 http、server 或 location),且 deny all 需出现在 allow 之后才能正确拦截非白名单请求。
明确 location 匹配范围
确保 location 的路径匹配准确,避免因匹配失败导致规则不生效:
- 用
location ^~ /admin/匹配以/admin/开头的路径,优先级高且不区分正则 - 避免使用
location /admin(末尾无斜杠),它会错误匹配/administer等无关路径 - 若需精确匹配,用
location = /api/debug,只作用于该完整路径
在 location 内配置 allow/deny 规则
IP 限制逻辑必须写在 location 块内部,并按“先 allow,后 deny all”顺序书写:
-
allow 192.168.1.100;—— 允许单个 IP -
allow 10.0.0.0/8;—— 允许整个私有网段 -
deny all;—— 必须放在所有allow之后,否则会被忽略 - 注意:不能在
location中使用if ($remote_addr = ...)替代,Nginx 不支持在location中用if做访问控制
处理常见异常情况
以下问题容易导致限制失效,需提前检查:
- 如果站点启用了 CDN 或反向代理(如 Cloudflare),
$remote_addr是代理 IP,需配合real_ip_header X-Forwarded-For;和set_real_ip_from使用真实 IP 列表 - 多个
location块之间互不影响,确保规则写在目标路径对应的块里,不要误写在父路径或无关路径中 - 测试时用
curl -x "" -H "Host: example.com" http://your-server-ip/admin/status绕过 DNS 和 CDN,确认原始规则是否生效
完整配置示例
限制仅允许内网和运维主机访问后台接口:
location ^~ /backend/api/ {
allow 172.16.0.0/12;
allow 203.0.113.45;
deny all;
}
该配置拒绝除指定网段和单 IP 外的所有请求,返回 403 Forbidden。











