多层代理获取用户真实IP
1. 几个概念
remote_addr:如果中间没有代理,这个就是客户端的真实IP,如果有代理,这就是上层代理的IP.
X-Forwarded-For:一个HTTP扩展头,格式为 X-Forwarded-For: client, proxy1, proxy2
X-Real-IP:自定义的HTTP头,用于把客户端真实IP一层层传递下去。
2.几个变量
$remote_addr:上层IP(客户端或代理)
$proxy_add_x_forwarded_for:包括客户端请求头的X-Forwarded-For和$remote_addr
$http_x_forwarded_for:就是X-Forwarded-For的值
3. 获取客户端真实IP的方法
3.1 通过设置X-real-IP层层传递
首层代理:proxy_set_header X-Real-IP $remote_addr; 针对首层代理,拿到真实IP
非首层代理:proxy_set_header X-Real-IP $http_x_real_ip; # 针对非首层代理,一直传下去
3.2 通过设置X-Forwarded-For请求头
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
然后截取X-Forward-For请求头的第一段,即是客户端的真实IP
4. 经过CDN后,获取用户真实IP的方法
4.1 一般CDN都会传递X-Forwarded-For请求头,通过X-Forwarded-For请求头获取用户真实IP。
4.2 后端Nginx配置
http {
map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}
}
我们通过map自定义了一个变量$clientRealIp;
如果X-Forwarded-For头是空的,那么客户端真实IP就是remote_addr;
如果X-Forwarded-For头非空,我们就通过正则匹配,捕获到第一段,这就是用户的真实IP;
必须注意的是,在每一层代理都要设置X-Forwarded-For头。
多层代理获取用户真实IP的更多相关文章
- nginx反向代理获取用户真实ip
nginx做反向代理时,默认的配置后端获取到的ip都是来自于nginx,如何转发用户的真实ip到后端程序呢?如是是java后端,用request.getRemoteAddr();获取到的是nginx的 ...
- 在有nginx做反向代理时候,如何获取用户真实Ip信息
在获取用户的Ip地址时,不一定可以获取到用户真实的地址信息,这要看代理服务器的类型,代理服务器有普通匿名代理服务器,高匿代理服务器,像这种情况很难获取到用户真实的Ip地址 假如用户没有使用匿名代理服务 ...
- 如何根据HttpServletRequets获取用户真实IP地址
最近的一个项目的某个功能获取用户的ip地址,添加用户的系统使用记录. 我发现当我直接使用getRemoteAddr()方法从HttpServletRequet中获取用户的ip时,获取到的是服务器的ip ...
- Java中使用HttpRequest获取用户真实IP地址端口
import javax.servlet.http.HttpServletRequest; /** * 自定义访问对象工具类 * * 获取对象的IP地址等信息 * @author X-rapido * ...
- 获取用户真实IP:(模拟:客户端--F5--nginx--tomcat 后端获取用户真实IP)
模拟:客户端--F5--nginx--tomcat 后端获取用户真实IP 192.168.109.137 :nginx01(充当第一层代理==F5)192.168.109.138 :nginx02(二 ...
- PHP获取用户真实 IP , 淘宝IP接口获得ip地理位置(转)
<?php /** * 获取用户真实 IP */ function getIP() { static $realip; if (isset($_SERVER)){ if (isset($_SER ...
- java 获取用户真实ip
/** * 获取用户真实ip * @param request * @return */ public static String getIpAddr(HttpServletRequest reque ...
- nginx多层反向代理获取客户端真实ip
访问路径: 用户 --> www.chinasoft.cn(nginx反向代理) --> www.chinasoft.com(nginx反向代理) --> python服务端程序 经 ...
- nginx的配置:目的是使用nginx反向代理后,应用程序获取用户真实ip
一.了解nginx Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为HT ...
随机推荐
- Python基础简介与简单使用
Python介绍 Python发展史 1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python’s Flyi ...
- day02-python基础2
操作 列表是用来存储一组数据,可以实现对列表中元素的增删改查等操作. 转换: list(string):把字符串转为列表 声明: 列表使用方括号 查询: 根据元素下标获取列表中元素的值 切片: [0: ...
- 使用cloudbase-init初始化windows虚拟机
CloudBase-init简介 cloudbase-init 是 Windows 和其他系统的云初始化程序,可以设置主机名.创建用户.设置静态ip.设置密码等.对应的linux初始化程序是cloud ...
- diskimage-builder
Supported Distributions Distributions which are supported as a build host: Centos 6, 7 Debian 8 (“je ...
- Linux 内核数据结构bitmap
#include <stdio.h> #include <stdlib.h> #define MAX_PRIO 10000 #define BITS_PER_LONG 32 # ...
- servlet 图片流
http://www.cnblogs.com/focusj/archive/2011/04/30/2057577.html https://segmentfault.com/q/10100000004 ...
- PHP生成随机数函数rand(min,max)
rand(min,max):生成min到max 的随机数,注意:包括边界rand() 返回 0 到 RAND_MAX 之间的伪随机整数.例如,想要 5 到 15(包括 5 和 15)之间的随机数,用 ...
- web服务器集群session同步
在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...
- Ubuntu安装完之后需要做的事情
字体推荐思源 lantern可以设置全局代理 安装好了ubuntu之后,安装gnome主题 安装Gnome之前,升级系统: $ sudo apt update $ sudo apt upgrade 1 ...
- 洛谷 P2597 [ZJOI2012]灾难 解题报告
P2597 [ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发 ...