获取客户端真实ip

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的地址成了内网地址

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Nginx (engine x)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器...
    hhf_Engineer阅读 6,563评论 0 1
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,092评论 19 139
  • Nginx的配置文件nginx.conf配置详解如下: user nginx nginx ; Nginx用户及组:...
    IT码农工阅读 4,346评论 0 0
  • “我是谁”,讲好这个主题是获取别人信任的捷径。 002 “我为何而来” ,讲好这个主题是为了消除外界对你的猜疑。...
    Chaylse酱阅读 1,261评论 0 0
  • 在日常生活中,获取信息很重要。怎么才能最有效地获取信息呢?很简单,提个好问题。有人会说,问问题谁不会啊?但实际上,...
    EC君_王磊阅读 3,060评论 0 0

友情链接更多精彩内容