Nginx - 如果是 IP 则返回 proxy_pass 否则返回 403

Nginx - 如果是 IP 则返回 proxy_pass 否则返回 403

我正在尝试将具有特定 IP 的用户通过 proxy_pass 传递给 ,http://server1并将某些其他用户传递给http://server2。如果用户与任何 IP 都不匹配,我想返回 403。以下是我所拥有的:

geo $userGroup1 {
        default 0;
        192.168.178.2 1;
}
geo $userGroup2 {
        default 0;
        192.168.178.3 1;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;
         
        server_tokens off;
        server_name _;

        index index.html index.htm index.nginx-debian.html;
        
        server_name _;

        location / {
            if ($userGroup1) {
                    proxy_pass http://server1 
            }
            if ($userGroup2) {
                    proxy_pass http://server2
            }
            
            # return 403 <-- returns 403 for all users
            
        }
}

我的配置需要如何改变?

答案1

终于开始测试这个了,请记住“proxy_pass”不能包含下面示例中的 URI,请使用 IP 地址。

如果您想通过 URI 转发到另一台服务器,您可以使用“return”或“rewrite”而不是“proxy_pass”;有关更多信息,请单击这里

geo $remote_addr $userGroup {
        default             0;
        192.168.178.2       1;
        192.168.178.3       2;
}


server {
    listen 80;
    listen [::]:80;
    
    server_name _;
    server_tokens off;

    index index.html index.htm index.nginx-debian.html;
    
    location / {
            if ($userGroup = 1) {
                    proxy_pass https://192.168.178.201;
            }
            if ($userGroup = 2) {
                    proxy_pass https://192.168.178.202;
            }
            
            return 403; # Anyone else would get a 403
    }
}

答案2

尝试使用指令'休息' 在 'if' 语句中,如下所示:

geo $userGroup1 {
       default 0;
       192.168.178.2 1;
}

geo $userGroup2 {
        default 0;
        192.168.178.3 1;
}

server {
        listen 80 default_server;
        listen [::]:80 default_server;
         
        server_tokens off;
        server_name _;

        index index.html index.htm index.nginx-debian.html;
        
        server_name _;

        location / {
            if ($userGroup1) {
                    proxy_pass http://server1;
                    break; # <-------- HERE
            }
            if ($userGroup2) {
                    proxy_pass http://server2;
                    break; # <-------- HERE
            }
            
            return 403; # <-- returns 403 for all users
            
        }
}


相关内容