Nginx 中为特定 URL 路径设置访问白名单需在 location 块内按“先 allow 后 deny all”顺序配置 IP 规则,并注意匹配优先级、real_ip 处理及代理场景;复杂需求可用 map 模块实现灵活控制。

在 Nginx 中为特定 URL 路径设置访问白名单,核心是结合 location 块与 allow/deny 指令,并以 deny all 结尾实现精准控制。关键在于匹配顺序、IP 判断时机和配置位置是否正确。
1. 使用 location 匹配目标路径
先用 location 精确或前缀匹配需要保护的路径,例如 /admin/ 或 /api/v1/internal。注意匹配优先级:精确匹配(=) > 长前缀匹配 > 正则匹配(~ 或 ~*)。
示例:
location /admin/ {
# 白名单规则将放在这里
}2. 在 location 内配置 allow/deny 规则
白名单逻辑是“只允许指定 IP,其余一律拒绝”。必须按“先 allow,后 deny all”的顺序书写,且 deny all 不可省略——Nginx 不会默认拒绝未匹配的请求。
- 单个 IP:
allow 192.168.1.100; - IP 段:
allow 10.0.0.0/8; - 多个 IP 或网段:每行一个
allow,最后跟deny all; - 支持 IPv6:
allow 2001:db8::/32;
完整示例:
location /admin/ {
allow 192.168.1.50;
allow 2001:db8::1;
allow 10.0.0.0/8;
deny all;
}3. 注意 real_ip 和代理场景
如果 Nginx 前有 CDN、负载均衡器或反向代理(如 SLB、Cloudflare),客户端真实 IP 可能藏在 X-Forwarded-For 或 X-Real-IP 请求头中。此时需启用 realip 模块并配置 set_real_ip_from,否则 allow/deny 判断的是代理 IP,而非用户真实 IP。
示例(假设可信代理地址为 172.16.0.10):
set_real_ip_from 172.16.0.10;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
<p>location /admin/ {
allow 192.168.1.100;
deny all;
}4. 替代方案:用 map 实现更灵活的白名单
当白名单规则复杂(如动态加载、大量 IP、需结合变量判断)时,可用 map 预定义变量,再在 location 中引用。这种方式便于维护,也支持从外部文件引入(配合 include)。
示例:
map $remote_addr $is_allowed {
default 0;
192.168.1.100 1;
10.0.0.5 1;
}
<p>server {
location /admin/ {
if ($is_allowed = 0) {
return 403;
}
}
}注意:if 在 location 中慎用,简单场景推荐直接用 allow/deny;map 更适合需复用或集中管理 IP 列表的场景。


















