今天帮兄弟项目搞了一个获取客户端真实IP的问题,网上这种问题很多,但是对于我们的场景都不太合用,现把我的解决方案share给大家,如有问题,请及时指出。

场景:

在请求到达后端服务之前,会经过层层代理的转发。

一般的解决方案:

proxy_set_header            Host $host;

proxy_set_header            X-real-ip $remote_addr;

proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

 

后端服务获取客户端真实IP的方法:
request.getAttribute("X-real-ip")

现象:

后端服务获取到的IP并不是客户端真实IP,而是某一级代理的IP。

分析:

从CDN开始,每经过一个代理做一次转发,x_forwarded_for就会在后面追加一个代理IP。请求到达nginx时,x_forwarded_for已经变成一个以逗号分隔的ip串,并且以转发顺序排序。

nginx的内置变量remote_addr仅能代表nginx的上一层代理的IP,现有的nginx配置将该值赋给X_Real_Ip,那么后端获取到的X_Real_Ip也是nginx上一层代理的IP,而不是客户端真实IP。

解决方案:

x_forwarded_for中的IP串,第一个IP即可代表客户端真实IP,因此可在nginx上对x_forwarded_for做一个正则匹配,获取第一个逗号之前的IP赋值给X-real-ip,从而达到不需要修改应用即可获取客户端真实IP的目的。

示例配置如下:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

set $Real $http_x_forwarded_for;

if ( $Real ~ (\d+)\.(\d+)\.(\d+)\.(\d+),(.*) ){

set $Real $1.$2.$3.$4;

}

proxy_set_header X-Real-Ip $Real;

nginx获取经过层层代理后的客户端真实IP(使用正则匹配)的更多相关文章

  1. nginx反向代理、让代理节点记录客户端真实IP

    环境:根据http://www.cnblogs.com/zzzhfo/p/6032095.html环境配置 在web01或web02上查看用户访问日志 先客户端访问 [root@web_backup ...

  2. 某云负载均衡获取客户端真实IP的问题

    某云负载均衡真实IP的问题,我们这边已经遇到过两次了.而且每次和售后沟通的时候都大费周折,主要是要给售后说明白目前文档的获取真实IP是有问题的,他们觉得文档上说明的肯定没问题,售后要是不明白,他们不会 ...

  3. Nginx反向代理后应用程序获取客户端真实IP

    Nginx反向代理后,Servlet应用通过request.getRemoteAddr()取到的IP是Nginx的IP地址,并非客户端真实IP,通过request.getRequestURL()获取的 ...

  4. nginx 代理模式下,获取客户端真实IP

    最近做博友推荐,发现个小问题,用$_SERVER['REMOTE_ADDR'];得到的都是服务器的地址192.168.96.52,搜索了一下,发现问题,改为$_SERVER['HTTP_X_REAL_ ...

  5. 服务器架构前面加了防火墙,Nginx如何获取客户端真实ip???

    在大部分实际业务场景中,网站访问请求并不是简单地从用户(访问者)的浏览器直达网站的源站服务器,中间可能经过所部署的CDN.高防IP.WAF等代理服务器.例如,网站可能采用这样的部署架构:用户 > ...

  6. 【Nginx】如何获取客户端真实IP、域名、协议、端口?看这一篇就够了!

    写在前面 Nginx最为最受欢迎的反向代理和负载均衡服务器,被广泛的应用于互联网项目中.这不仅仅是因为Nginx本身比较轻量,更多的是得益于Nginx的高性能特性,以及支持插件化开发,为此,很多开发者 ...

  7. Java Web 获取客户端真实IP

    Java Web 获取客户端真实IP 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP.一般分为两种情况: 方 ...

  8. nginx做负载均衡 tomcat获得客户端真实ip

    因项目需要做tomcat2台机器的负载均衡,配置好负载环境后,发现tomcat的日志一律是我前置nginx代理服务器的ip 通过百度教材发现需要修改nginx的配置文件,修改代理头信息,传递给后方,后 ...

  9. 获取客户端真实IP地址

    Java-Web获取客户端真实IP: 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP. 一般分为两种情况: ...

随机推荐

  1. cxdbImage以及图像显示

    把pdf以及图像存入数据库,然后根据需要显示出来.在处理的过程中,不同类型的图像格式有其不同的类,如果这个概念不清楚,就会绕一个很大的圈子. MyJPEG : TJPEGImage ; mypng : ...

  2. 使用timthumb.php截取文章缩略图

    wordpress自带的缩略图功能会对每次上传的所有图片根据设置的图片尺寸进行裁剪,并把原图和裁剪后的图片保存在网站空间中,图片只裁剪一次,更改设置的尺寸不会重新生成,这样不仅占用主机空间,以后改版网 ...

  3. Merging into a Table: Example

    Merging into a Table: Example The following example uses the bonuses table in the sample schema oe w ...

  4. Navicat Premium (patch and keygen)

    标签:Navicat 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://sofar.blog.51cto.com/353572/13 ...

  5. 时序图与状态图(Rose) - Windows XP经典软件系列

    以CAN转UART(串口)为例. 功能简单介绍: 当主程序收到CAN口的数据后:依据按键的不同来选择是使用CAN口发送,还是使用UART口发送. 一.图片 时序图 watermark/2/text/a ...

  6. CentOS 7通过yum安装fcitx五笔输入法

    CentOS 7通过yum安装fcitx五笔输入法 下面通过了亲測: 1.设置源 Posted in Linux at 三月 5th, 2015 / No Comments ? 增加EPEL源 EPE ...

  7. Libgdx: android单机斗地主支持局域网wifi联网的网络模块核心代码

    这个作品是我近期写的,结合我的毕业设计的通信模块和之前的单机版斗地主.我已经上架到豌豆荚了,贴了点广告,看看能不能赚点茶钱. 但是一点也不乐观.因此我想分享给大家源代码. 仅仅要不用于商业. 以下先贴 ...

  8. oc15--文档安装

    // // main.m // 修改项目模板 /* 工程名称: 文件名称: 创建者 : 创建时间: 版权 : 修改人 : 修改时间: */ #import <Foundation/Foundat ...

  9. vim相关资料

    http://www.360doc.cn/article/15064667_402846667.html http://blog.jobbole.com/86809/ http://blog.csdn ...

  10. vim设置solarized配色

    最近在学习使用VIM.我选择Solarized配色.相信很多人也都在用. 官网地址: http://ethanschoonover.com/solarized 看这配色:八卦乾坤,赏心悦目,高端大气上 ...