Nginx中allow/deny访问控制必须置于location块内、按先allow后deny all顺序配置,并在代理环境下通过set_real_ip_from和real_ip_header还原真实IP方可生效。

在 Nginx 中用 allow 和 deny 实现灵活的 IP 访问控制,关键不在指令数量,而在作用域、顺序和真实 IP 的准确性。配错位置或颠倒顺序,规则就完全失效。
必须放在 location 块里才起作用
这两个指令只在 location(或 limit_except)块中生效。写在 http 或 server 顶层,Nginx 不报错,但也不会执行——看起来配置成功,实则形同虚设。
- 正确做法:为管理路径单独定义,比如
location /admin/ { ... }、location ^~ /manage/ { ... } - 避免误伤:不放在
server块里,否则静态资源、健康检查接口也会被限制 - 常见错误:把规则塞进
upstream、if块,或丢到配置最外层,语法能通过,但无实际效果
顺序决定逻辑:先 allow,再 deny all
Nginx 按配置顺序逐行匹配,命中即停。白名单机制依赖“明确放行 + 牢固兜底”:
- 每条
allow独占一行,支持多个内网网段并列,例如:allow 127.0.0.0/8;allow 10.0.0.0/8;allow 172.16.0.0/12;allow 192.168.0.0/16; -
deny all;必须是该location中最后一条访问控制指令 - 漏掉
deny all;?未匹配的 IP 默认放行,整个白名单就失效了 - 后面不能再跟其他
allow或deny,否则会被忽略
代理环境下必须还原真实客户端 IP
如果 Nginx 前面有 SLB、CDN、Traefik 或另一层 Nginx,$remote_addr 是代理 IP,不是用户真实出口 IP。此时 allow/deny 判的是代理地址,规则完全失准。
- 确认上游透传了
X-Forwarded-For头,且该头内容可信(需代理层清洗) - 在对应
location或server块中加入:set_real_ip_from 10.0.0.0/8;(替换为你可信代理的网段)real_ip_header X-Forwarded-For; - 之后
allow判断的才是真实客户端 IP
验证是否真正生效
别只测本地 127.0.0.1,要覆盖典型边界场景:
- 用内网最大地址(如
10.255.255.255)访问,应返回200 - 用非内网 IP(如
11.0.0.1)访问,必须返回403 Forbidden - 查错误日志:
tail -f /var/log/nginx/error.log,看到access forbidden by rule表示规则已加载但未放行 - 重载前务必执行
nginx -t检查语法,再nginx -s reload,避免服务中断











