美文网首页我爱编程
获取客户端真实ip

获取客户端真实ip

作者: cubotudo | 来源:发表于2018-08-09 17:45 被阅读0次

location /gameExchange {

            proxy_set_header X-Real-IP $remote_addr;

            proxy_pass http://gameExchange;

            proxy_set_header Host $http_host;

            proxy_set_header REMOTE-HOST $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

          # proxy_connect_timeout 4;  #nginx跟后端服务器连接超时时间(代理连接超时)

            #proxy_read_timeout 4; #连接成功后,后端服务器响应时间(代理接收超时)

        }

nginx log 格式:

log_format main '$remote_addr [$time_local] request_time[$request_time] upto $upstream_addr,'

                      'upresponse_time[$upstream_response_time], "$request" $status $body_bytes_sent '

                      '"$http_user_agent"';

nginx 中如上配置,查看access.log发现$remote_addr打印出来都是内网地址

java 程序获取真实IP代码如下:

public static String getRequestIP(HttpServletRequest request) {

String ip = request.getHeader("x-forwarded-for");

if (ip ==null || ip.length() ==0 ||"unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("Proxy-Client-IP");

}

if (ip ==null || ip.length() ==0 ||"unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("WL-Proxy-Client-IP");

}

if (ip ==null || ip.length() ==0 ||"unknown".equalsIgnoreCase(ip)) {

ip = request.getRemoteAddr();

}

//多次反向代理,取第一个IP地址

    if (ip !=null && ip.length() >15) {

if (ip.indexOf(",") >0) {

ip = ip.substring(0, ip.indexOf(","));

}

}

return ip;

}

调用无法获取真实的IP


解决办法: 把$remote_addr替换成$http_x_forwarded_for

location /gameExchange {

            proxy_set_header X-Real-IP $http_x_forwarded_for;

            proxy_pass http://gameExchange;

            proxy_set_header Host $http_host;

            proxy_set_header REMOTE-HOST $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

          # proxy_connect_timeout 4;  #nginx跟后端服务器连接超时时间(代理连接超时)

            #proxy_read_timeout 4; #连接成功后,后端服务器响应时间(代理接收超时)

        }

log_format main '$http_x_forwarded_for [$time_local] request_time[$request_time] upto $upstream_addr,'

                      'upresponse_time[$upstream_response_time], "$request" $status $body_bytes_sent '

                      '"$http_user_agent"';


原因:nginx层前面还经过层F5负载均衡,

其中$http_x_forwarded_for就是nginx接受到的http request header中的X-Forwarded-For的值

$remote_addr是直接与nginx通信的那台主机的ip。nginx层前面还经过层F5负载均衡,所以$remote_addr的地址成了内网地址

相关文章

  • 【充电】《Nginx核心知识100讲》postread阶段:获取

    50 | postread阶段:获取真实客户端地址的realip模块 获取真实用户IP地址 realip模块可以帮...

  • Nginx 之 X-Forwarded-For 中首个IP一定真

    欢迎访问陈同学博客原文 使用 Nginx 基于客户端IP进行限流时,需在代理中拿到客户端真实IP。获取IP方式有多...

  • 获取客户端真实ip

    location /gameExchange { proxy_set_header X-Real-IP...

  • 获取客户端真实IP

    在Java网站服务器中,要获取客户端的真实IP,一般有二种情况。 一、客户端直连服务器 如果客户端直接连接服务器这...

  • java获取真实ip工具类

    场景 有的时候我们需要获取客户端的真实ip,用来实现ip白名单,和黑名单的配置! ip工具类如下

  • java获取客户端ip

    java获取客户端ip 在开发工作中,我们常常需要获取客户端的IP。一般获取客户端的IP地址的方法是:reques...

  • 79笔记

    在会员服务中直接从Request获取请求来源,获取的为网关的服务的ip,并不是最终真实的客户端ip。解决办法:Ng...

  • 服务器如何获取请求IP

    转载于:叉叉哥Jetty/Tomcat + Nginx反向代理获取客户端真实IP、域名、协议、端口 利用X-For...

  • Python获取客户端IP地址

    获取客户端IP地址

  • js获取客户端真实IP

    java获取客户端程序本身还有对应的对象来实现。而js却不行。搜罗了一些资料,发现比较全而好的前端获取客户端IP的...

网友评论

    本文标题:获取客户端真实ip

    本文链接:https://www.haomeiwen.com/subject/wgucbftx.html