Nginx 的 allow/deny 必须置于 location 块内,按“allow 在前、deny all 垫底”顺序配置,代理环境需 set_real_ip_from + real_ip_header 还原真实 IP,并通过多场景测试及错误日志验证生效。

用 allow 和 deny 限制 IP 访问,核心是“先放行、后拒绝”,且必须写在 location 块里才真正起作用。
规则必须放在 location 块中
这两个指令只在 http、server、location 或 limit_except 块中有效。最常见错误是写在 http 或 server 顶层,或塞进 if 块里——语法可能不报错,但完全不生效。
- 管理后台路径是
/admin/?就放进location /admin/ { ... } - 所有后台接口走
/api/v1/manager?就配location /api/v1/manager { ... } - 静态资源统一由
.php处理?可用location ~ \.php$ { ... }
顺序不能错:allow 在前,deny all 必须垫底
Nginx 从上到下逐行匹配,命中即停。所以白名单逻辑必须是“明确放行 → 兜底拒绝”:
- 每条
allow独立一行,支持单 IP(如allow 192.168.5.20;)、IPv4 网段(如allow 10.0.0.0/8;)、IPv6(如allow 2001:db8::/32;) - 多个网段直接追加多行
allow即可 -
deny all;必须放在所有allow之后,且是该location中最后一条访问控制指令 - 漏掉
deny all;,未匹配的 IP 默认放行,白名单就失效了
代理环境下要还原真实客户端 IP
如果 Nginx 前面有 CDN、SLB、Traefik 或 Nginx Proxy Manager,$remote_addr 是代理节点 IP,不是用户真实出口 IP,allow/deny 会失准。
- 确认上游透传了
X-Forwarded-For或X-Real-IP头,且内容可信(需代理层清洗) - 在
http块中添加:set_real_ip_from 192.168.10.0/24;(替换成你实际的可信代理网段) - 再加:
real_ip_header X-Forwarded-For;或real_ip_header X-Real-IP; - 漏掉
set_real_ip_from,就算写了real_ip_header也没用——Nginx 会忽略未授权来源的头
验证是否真生效
别只测一个 IP,要覆盖典型场景:
- 用内网最大地址(如
10.20.255.255)访问,应返回200 - 用非内网 IP(如
11.0.0.1)访问,必须返回403 Forbidden - 查错误日志:
tail -f /var/log/nginx/error.log,看到access forbidden by rule表示规则已加载但未放行 - 运行
nginx -t验证配置语法,尤其防/33这类非法 CIDR 掩码(Nginx 不报错但整块失效)


















