负载均衡后获取客户端真实ip

本文介绍在Nginx负载均衡环境下,如何通过配置Header中的'X-Forwarded-For'或'X-Real-IP'字段来获取客户端的真实IP地址,解决了在多级代理场景下获取真实客户端IP的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String ip3=request.getRemoteAddr(); 如果没有配负载均衡,则request.getRemoteAddr() 获取的就是真实客户端IP,如果配了nginx负载均衡,则request.getRemoteAddr() 获取的是负载均衡nginx服务器的ip,而不是真实客户端IP。

那么问题来了,经过nginx负载均衡后,如何获取客户端真实ip?

location / {
    root   html;
    index  index.html index.htm;
    
    proxy_redirect off;
    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_pass http://192.168.81.188:8080;
}
 

代码中,Header中使用“X-Forwarded-For”字段或“X-Real-IP”字段获取Client真实 IP。

以一个servlet为例:
 

​​​​​​​    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //response.getWriter().append("Served at: ").append(request.getContextPath());
        
        PrintWriter writer = response.getWriter();
        //也可以使用小写的字段 String ip=request.getHeader("x-forwarded-for");
        String ip=request.getHeader("X-Forwarded-For");
        writer.println("x-forwarded-for_ip:  "+ip);

        //也可以使用小写的字段 String ip2=request.getHeader("x-real-ip");
        String ip2=request.getHeader("X-Real-IP");
        writer.println("x-real-ip:  "+ip2);

        String ip3=request.getRemoteAddr();
        writer.println("RemoteAddr:  "+ip3);
        
        
    }

注意:从Header中获取字段的时候,是不区分大小写的。所以 request.getHeader("x-forwarded-for")和request.getHeader("X-Forwarded-For")以及request.getHeader("x-FORWARded-for")效果是一样的。

 

 

如果通过了多级反向代理的话,X-Forwarded-For的值不止一个,而是一串IP值,此时取第一个IP地址就可以了,第一个IP代表客户端真实IP,比如:

分析:
从CSN开始,每经过一个代理做一次转发,x_forwarded_for就会在后面追加一个代理IP。请求到达nginx时,x_forwarded_for已经变成一个以逗号分隔的ip串,并且以转发顺序排序。
nginx的内置变量remote_addr()仅能代表nginx的上一层代理的IP,现有的nginx配置将该值赋给X_Real_IP,那么后端获取到的X_Real_IP只是nginx上一层代理的IP,而不是客户端真实的IP。

举例:如图,我经过两层代理,最终到达后端真实业务服务器:

浏览器访问结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wudinaniya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值