You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于$args正则匹配在NGINX中实现指定请求的IP访问限制

Nginx指定参数路径IP访问限制实现方案

错误配置原因说明

Nginx的if指令归属于rewrite模块,不支持在if代码块内嵌套allow/deny这类访问控制模块的指令,因此你编写的配置无法正常生效。

可行实现方案

方案1:多条件if判断(适合简单场景)

直接通过多轮if判断组合参数匹配、IP白名单规则,匹配到拦截条件时直接返回403:

location /login {
    # 初始化拦截标记为不拦截
    set $block 0;
    # 匹配person=super参数时标记为待拦截
    if ($args ~* "(^|&)person=super(&|$)") {
        set $block 1;
    }
    # 客户端IP属于白名单时取消拦截标记
    if ($remote_addr = "1.2.3.4") {
        set $block 0;
    }
    # 标记为拦截的请求直接返回403
    if ($block = 1) {
        return 403;
    }
    # 你的其他原有配置,比如proxy_pass
    # proxy_pass http://your_upstream;
}

上述参数匹配规则加了(^|&)和(&|$)限定符,可避免other_person=super这类参数误匹配的问题。

方案2:map模块实现(适合规则复杂场景)

如果白名单IP较多、或者后续需要频繁调整规则,更推荐用map模块实现,规则定义更清晰可维护:

  1. 首先在http块中添加如下map配置:
# 匹配是否携带person=super参数
map $args $is_super_request {
    default 0;
    ~*(^|&)person=super(&|$) 1;
}
# 定义IP白名单
map $remote_addr $is_allowed_ip {
    default 0;
    1.2.3.4 1;
    # 可继续添加其他白名单IP/IP段,例如:
    # 192.168.1.0/24 1;
}
  1. 再在location块中添加判断逻辑:
location /login {
    # 同时满足:是super请求 + IP不在白名单,返回403
    if ($is_super_request$is_allowed_ip = "10") {
        return 403;
    }
    # 你的其他原有配置,比如proxy_pass
    # proxy_pass http://your_upstream;
}

proxy_pass对规则的影响

配置proxy_pass反向代理不会对这类访问控制规则产生影响。
Nginx的参数匹配、IP判断逻辑都执行在请求转发到上游服务之前,只要你没有手动修改$args、$remote_addr变量的值,规则就会正常生效。
如果你的Nginx前端还有CDN、负载均衡等其他代理层,需要配置前置代理传递真实客户端IP,将上述配置中的$remote_addr替换为$http_x_forwarded_for即可。

内容的提问来源于stack exchange,提问作者Stephen Gibbons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:18:01