使用Nginx反向代理时,如何根据请求URI参数设置IP白名单?

When using Nginx reverse proxy, how can I set IP whitelist based on request URI parameter?

我的url是这样的:

http://myserver/app/inf?ConId=Obj%3Acom.aaa.bbb%3A3712 # Only IP in whitelist can access
http://myserver/app/...... # all user can access

当ConId参数为Obj%3Acom.aaa.bbb%3A3712时,我需要限制特定IP才能访问我的服务器

我尝试了以下 Nginx 配置但没有用。

 location / {
            if ( $arg_ConId = "Obj%3Acom.aaa.bbb%3A3712" ) { 
                allow 192.168.1.104;
                deny  all;
            }
            proxy_pass http://192.168.234.130:80;
            add_header Access-Control-Allow-Origin *;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_http_version 1.1;
            allow all;
        }

请帮忙,谢谢!


谢谢@araisch,我最终的 Nginx 配置是:

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    
    #keepalive_timeout  0;
    keepalive_timeout  65;
    
    server {
        listen       80;
        server_name  localhost;
        error_page  403              /403.html;
        
        location = /403.html {
            root html;
        }
        
        if ($arg_ConId  = "Obj%3Acom.aaa.bbb%3A3712") {
           set $BLOCKING A;
        }
        if ($remote_addr != "192.168.3.11") {
           set $BLOCKING "${BLOCKING}B";
        }
        if ($BLOCKING = AB) {
           return 403;
           break;
        }
                
        location / {
            proxy_pass http://192.168.234.130:80;
            add_header Access-Control-Allow-Origin *;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_http_version 1.1;
            allow all;
        }

    }
}

你可以这样使用:

location / {
  auth_request /auth-here; 
}

location /auth-here {
  internal;
  proxy_pass http://192.168.234.130:80/auth.php;
  proxy_pass_request_body off;
  proxy_set_header Content-Length "";
  proxy_set_header X-Original-URI $request_uri;
} 

然后在您的脚本中,您可以检查 $_SERVER['HTTP_X_ORIGINAL_URI'] 和 return HTTP 200 以允许请求或 HTTP 403 以拒绝请求。

您需要 http_auth_request_module 才能使上述工作正常进行,如 the documentation 中所述。

可以使用类似的东西:

if ($arg_ConId = "Obj%3Acom.aaa.bbb%3A3712") {
   set $BLOCKING A;
}
if ($remote_addr != 192.168.1.104) {
   set $BLOCKING "${BLOCKING}B";
}
if ($BLOCKING = AB) {
   return 403;
   break;
}

server 块中。

您的代码中的问题:

  • if location 中的指令由于 nginx 奇怪的声明规则而被认为是邪恶的。他们大部分时间都在做奇怪的事情,所以尽量避免。
  • $arg_ContainerOID 没有捕获名为“ConId”的参数

备注:这在网桥模式下的dockerized nginx中不起作用,因为真实IP被防火墙屏蔽了。