必须在location块内按顺序配置allow放行内网网段、deny all兜底拒绝,且需通过set_real_ip_from和real_ip_header还原真实ip;写在http/server顶层或if块中均不生效。

要让管理后台只对公司内网 IP 开放,核心就是用 allow 明确放行内网网段,再用 deny all 拦住其余所有请求——顺序不能错,位置不能偏。
必须写在 location 块里
白名单规则只在 location 块中生效。比如后台路径是 /admin/ 或 /wp-admin/,就得把规则放进对应块里:
location /admin/ { ... }-
location ~ \.php$ { ... }(若后台脚本统一走 PHP) -
location /api/v1/manager { ... }(针对特定 API 接口)
写在 http 或 server 顶层块里,规则不生效;写在 if 块里,语法合法但完全忽略。
顺序严格:allow 在前,deny all 必须垫底
Nginx 从上到下逐行匹配,命中即停。所以必须先列所有允许项,最后只留一条 deny all;:
- 正确写法:
allow 10.20.0.0/16;<br>allow 172.16.100.0/24;<br>allow 127.0.0.1;<br>deny all;
- 错误写法:
deny all;<br>allow 10.20.0.0/16;
→ 所有请求第一步就被拒绝,后面全无效 - 漏掉
deny all;?未匹配的 IP 默认放行,白名单就失效了
注意真实客户端 IP 是否准确
如果 Nginx 前面有 SLB、CDN 或 Traefik,$remote_addr 是代理 IP,不是用户真实出口 IP:
- 确认上游透传了
X-Forwarded-For头,且内容可信(需代理层清洗) - 在配置中加入:
set_real_ip_from 192.168.10.0/24; # 替换为你的可信代理网段<br>real_ip_header X-Forwarded-For;
- 之后
allow判的才是真实客户端 IP,否则规则形同虚设
验证是否真生效
别只测一个 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 不报错但整块失效)











