在 nginx.conf 中需将 allow/deny 指令置于 location 块内,按“先允许多个合法来源、最后 deny all”顺序书写;支持单 IP、IPv4/IPv6 网段;代理环境下须配置 set_real_ip_from 和 real_ip_header;推荐用 include 抽离规则或 geo+map 动态管理。

在 nginx.conf 中对特定路径做访问权限控制,核心是把 allow 和 deny 指令正确写进对应的 location 块里,并严格遵循“先允许多个合法来源、最后统一拒绝”的顺序。
必须写在 location 块内部
allow/deny 规则只在 location 上下文中生效。写在 http 或 server 顶层块中无效。
- ✅ 正确位置:
location /admin/ { allow 192.168.1.0/24; deny all; } - ❌ 无效写法:
server { allow 192.168.1.0/24; }—— 不起作用 - 匹配要精准:用
^~ /admin/避免误匹配/administer;用= /api/health实现完全精确匹配
规则顺序决定权限逻辑
指令自上而下逐行匹配,命中即停止。白名单机制依赖这个执行顺序:
- 每条
allow单独一行,支持单 IP(allow 127.0.0.1;)、IPv4 网段(allow 10.0.0.0/8;)、IPv6(allow 2001:db8::/32;) - 允许多个来源?直接追加多行
allow -
deny all;必须放在所有allow之后,且是该location中最后一条访问控制指令 - 漏掉
deny all;,未匹配的请求会默认放行,等于没设白名单
应对代理环境的真实 IP 识别
如果前端有 CDN、负载均衡或反向代理,$remote_addr 是代理 IP,直接限制会失效:
- 需配合
set_real_ip_from声明可信代理地址 - 用
real_ip_header X-Forwarded-For;指定取真实 IP 的请求头 - 否则所有请求看起来都来自同一个代理 IP,容易误封或放行
提升可维护性的实用方式
硬编码 IP 在生产环境难管理,推荐两种更稳妥的做法:
- 用
include抽离规则:把白名单内容单独存为/etc/nginx/conf.d/admin-ip.conf,内容为: allow 172.16.0.0/12;
allow 192.168.100.0/24;
deny all;
然后在location中写:include /etc/nginx/conf.d/admin-ip.conf; - 用
geo + map动态标记:适合测试/生产环境 IP 段不同的情形,先在http块定义地理变量,再在location中判断并拦截


















