使用nginx反向代理后如何在后台web应用中获取用户ip

问题背景

在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用

request.getRemoteAddr()

就可以获取到客户端ip,但是当我们使用了nginx作为反向代理后,使用request.getRemoteAddr()获取到的就一直是nginx服务器的ip的地址,那这时应该怎么办?

原理解释

经过反向代理后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的ip,通过$remote_addr变量拿到的将是反向代理服务器的ip地址。

当你使用了nginx反向服务器后,在web端使用request.getRemoteAddr()本质上就是获取$remote_addr),取得的是nginx的地址,即$remote_addr变量中封装的是nginx的地址,当然是没法获得用户的真实ip的,但是,nginx是可以获得用户的真实ip的,也就是说nginx使用$remote_addr变量时获得的是用户的真实ip,如果我们想要在web端获得用户的真实ip,就必须在nginx这里作一个赋值操作,如下:
proxy_set_header  X-Real_IP  $remote_addr;
其中这个X-Real_IP是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-Real_IP这个变量里了,然后,在web端可以这样获取:

request.getHeader("X-Real_IP");

通常我们会看到有这样一些配置

server {
    listen       80;
    server_name  localhost;
    #charset koi8-r;
    #access_log  logs/host.access.log  main;
    location /{
        root   html;
        index  index.html index.htm;
        proxy_pass                  http://backend; 
       
        proxy_set_header            Host $host;
        proxy_set_header            X-real-ip $remote_addr;
        proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
        # proxy_set_header            X-Forwarded-For $http_x_forwarded_for;
    }
}



1. proxy_set_header  X-Real_IP  $remote_addr;
这句话之前已经解释过,有了这句就可以在web服务器端获得用户的真实ip
但是,实际上要获得用户的真实ip,不是只有这一个方法,下面我们继续看。
 
 

猜你喜欢

转载自blog.csdn.net/zsj777/article/details/87344804