nginx转发后后端怎么获取用户真实IP

经常有需求要获取访问用户的IP,在经过nginx转发后真实IP就被隐藏起来了,我们需要在头部信息里拿真实IP,下面是拿IP的代码,考虑了各种情况。

public static String getIpAddr(HttpServletRequest request) {
   String ip = request.getHeader("x-real-ip");

   if (ip == null || ip.length() == 0 
        || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("x-forwarded-for");
        if (ip != null) {
            ip = ip.split(",")[0].trim();
        }
    }

    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();
    }

    return ip;
}

但是后面还是一直拿不到真实的IP,基本上拿到的都是127.0.0.1 后面我把请求头都输出来了 我们在控制台把所有请求头输出来看看 获取请求头代码

Enumeration<String> h = request.getHeaderNames();
while(h.hasMoreElements()){
    String n = h.nextElement();
    System.out.println(n+"==="+request.getHeader(n));
}

输出结果如下

host===127.0.0.1:8080
connection===close
cache-control===max-age=0
upgrade-insecure-requests===1
user-agent===Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
accept===text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
referer===http://cxytiandi.com/navigation
accept-encoding===gzip, deflate, sdch
accept-language===zh-CN,zh;q=0.8

发现确实真实IP没有被带过来,我用的是nginx的默认配置,是不会带过来的。

需要添加转发的配置,将用户真实的IP设置到请求头中,然后带过来。

在nginx.conf中的location中增加如下代码:

proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;

然后再次请求就能看到输出的请求头的信息就多了一个x-forwarded-for。 真实IP被带过来了。

x-forwarded-for===124.15.252.240
host===cxytiandi.com
connection===close
cache-control===max-age=0
upgrade-insecure-requests===1
user-agent===Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
accept===text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
referer===http://cxytiandi.com/navigation
accept-encoding===gzip, deflate, sdch
accept-language===zh-CN,zh;q=0.8

本文分享自微信公众号 - 猿天地(cxytiandi)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CaiRui

nginx查看日志

nginx的log日志分为access log 和 error log 其中access log 记录了哪些用户,哪些页面以及用户浏览器、ip和其他的访问信息 ...

60060
来自专栏CaiRui

Nginx服务优化配置

1、expires缓存模块 ? 具体配置可参考官方文档 http://nginx.org/en/docs/http/ngx_http_headers_modul...

386100
来自专栏运维技术迷

编译安装openresty

OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭...

39880
来自专栏运维技术迷

nginx使用GeoIP限制国家访问

安装GEeoip库 安装完成之后,GeoIP数据库会被安装在/usr/share/GeoIP/GeoIP.dat. [root@vultr ~]# yum -y...

91950
来自专栏CaiRui

Nginx中worker_connections的问题

查看日志,有一个[warn]: 3660#0: 20000 worker_connections are more than open file resourc...

46560
来自专栏运维技术迷

nginx安装Fancy美化索引目录

参考文档:官方帮助 [root@tokyo home]# wget http://nginx.org/download/nginx-1.10.1.tar.gz...

35750
来自专栏Golang语言社区

像iPhone一样好玩的Web服务器: Caddy

据Netcraft今年5月份放出了一篇统计文章中,Apache、Nginx和微软的IIS分别以45.61%、20.22%和7.83%市场占有率依然排在“活跃网站...

886110
来自专栏圣杰的专栏

.NET Core+MySql+Nginx 容器化部署

1. 引言 上两节我们通过简单的demo学习了docker的基本操作。这一节我们来一个进阶学习,完成ASP.NET Core + MySql + Nginx的容...

47380
来自专栏互扯程序

CentOS7下Nginx服务器安装与使用教程

Nginx服务器简介 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。其特点是占用内存少,...

96250
来自专栏程序员宝库

Nginx 反向代理解决前后端联调跨域问题

keywords: Nginx反向代理 前后端联调 跨域 ---- 1.什么是跨域 跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏...

80740

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励