随着nginx的迅速崛起,越来越多公司将apache更换成nginx. 同时也越来越多人使用nginx作为负载均衡, 并且代理前面可能还加上了CDN加速,但是随之也遇到一个问题:nginx如何获取用户的真实IP地址,如果后端是apache,请跳转到<apache获取用户真实IP地址>,如果是后端真实服务器是nginx,那么继续往下看。
实例环境:
用户IP 120.22.11.11
CDN前端 61.22.22.22
CDN中转 121.207.33.33
公司NGINX前端代理 192.168.50.121(外网121.207.231.22)
1、使用CDN自定义IP头来获取
假如说你的CDN厂商使用nginx,那么在nginx上将$remote_addr赋值给你指定的头,方法如下:
proxy_set_header remote-user-ip $remote_addr; |
//如上,后端将会收到remote_user_ip的http头,有些人可能会挑错了,说我设置的头不是remote-user-ip吗,怎么写成了remote_user_ip,是不是作者写错了.请参考文章:<nginx反向代理proxy_set_header自定义header头无效>
后端PHP代码getRemoteUserIP.php
$ip = getenv( "HTTP_REMOTE_USER_IP" );
|
访问getRemoteUserIP.php,结果如下:
120.22.11.11 //取到了真实的用户IP,如果CDN能给定义这个头的话,那这个方法最佳 |
2、通过HTTP_X_FORWARDED_FOR获取IP地址
一般情况下CDN服务器都会传送HTTP_X_FORWARDED_FOR头,这是一个ip串,后端的真实服务器获取HTTP_X_FORWARDED_FOR头,截取字符串第一个不为unkown的IP作为用户真实IP地址, 例如:
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121(用户IP,CDN前端IP,CDN中转,公司NGINX代理)
getFor.php
$ip = getenv( "HTTP_X_FORWARDED_FOR" );
|
访问getFor.php结果如下:
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121 |
如果你是php程序员,你获取第一个不为unknow的ip地址,这边就是120.22.11.11.
3.使用nginx自带模块realip获取用户IP地址
安装nginx之时加上realip模块,我的参数如下:
./configure --prefix=/usr/ local /nginx-1.4.1 --with-http_realip_module
|
真实服务器nginx配置
server_name www.ttlsa.com;
|
access_log /data/logs/nginx/www.ttlsa.com.access.log main;
|
index index.php index.html index.html;
|
root /data/site/www.ttlsa.com;
|
root /data/site/www.ttlsa.com;
|
location = /getRealip.php
|
set_real_ip_from 192.168.50.0/24;
|
set_real_ip_from 61.22.22.22;
|
set_real_ip_from 121.207.33.33;
|
set_real_ip_from 127.0.0.1;
|
real_ip_header X-Forwarded-For;
|
fastcgi_pass unix:/var/run/phpfpm.sock;
|
getRealip.php内容
$ip = $_SERVER[ 'REMOTE_ADDR' ];
|
访问www.ttlsa.com/getRealip.php,返回:
如果注释 real_ip_recursive on或者 real_ip_recursive off
访问www.ttlsa.com/getRealip.php,返回:
很不幸,获取到了中继的IP,real_ip_recursive的效果看明白了吧.
set_real_ip_from:真实服务器上一级代理的IP地址或者IP段,可以写多行
real_ip_header:从哪个header头检索出要的IP地址
real_ip_recursive:递归排除IP地址,ip串从右到左开始排除set_real_ip_from里面出现的IP,如果出现了未出现这些ip段的IP,那么这个IP将被认为是用户的IP。例如我这边的例子,真实服务器获取到的IP地址串如下:
120.22.11.11,61.22.22.22,121.207.33.33,192.168.50.121
在real_ip_recursive on的情况下
61.22.22.22,121.207.33.33,192.168.50.121都出现在set_real_ip_from中,仅仅120.22.11.11没出现,那么他就被认为是用户的ip地址,并且赋值到remote_addr变量
在real_ip_recursive off或者不设置的情况下
192.168.50.121出现在set_real_ip_from中,排除掉,接下来的ip地址便认为是用户的ip地址
如果仅仅如下配置:
set_real_ip_from 192.168.50.0/24; |
set_real_ip_from 127.0.0.1; |
real_ip_header X-Forwarded-For; |
访问结果如下:
4、三种在CDN环境下获取用户IP方法总结
4.1 CDN自定义header头
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
缺点:需要CDN厂商提供
4.2 获取forwarded-for头
优点:可以获取到用户的IP地址
缺点:程序需要改动,以及用户IP有可能是伪装的
4.3 使用realip获取
优点:程序不需要改动,直接使用remote_addr即可获取IP地址
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段
相关推荐
#### 三、获取真实IP的第二种方法 在某些情况下,第一种方法可能仍然无法准确获取客户端的真实IP。例如,当使用Squid作为代理服务器时,默认配置下可能会将`X-Forwarded-For`设置为`unknown`。针对这种情况,我们...
然而,在实际应用中,很多情况下用户的请求会经过反向代理服务器(如Nginx、Squid等),这使得直接使用`request.getRemoteAddr()`方法获取到的IP地址往往并不是客户端的真实IP地址。 #### 二、问题分析 当客户端...
使用 SLB 后 Nginx、Apache 获取真实 IP 在使用 SLB(Server Load Balancer)后,如何获取真实 IP 是一个常见的问题。SLB 的作用是将用户请求分发到多个服务器上,以提高网站的负载能力和可用性。但是,在 SLB 后,...
"nginx扩展应用-获取真实IP" 本文将详细介绍如何使用nginx扩展应用来获取访问者真实IP,主要是通过在七层上配置Apache服务器前端(负载均衡),将真实的IP放在X-Forwarded-For的字段里,然后在日志中记录真实IP地址...
在标题“java socket nginx tcp转发 用户真实IP测试”中,主要探讨的是如何在Java的Socket连接中,通过Nginx的TCP转发获取到实际用户的IP地址。 在描述中提到的博客文章,很可能是详细介绍了这个问题的解决方案。...
需要注意的是,当客户端通过Nginx等反向代理服务器连接到应用服务器时,此方法获取的将是反向代理服务器的IP地址而非客户端真实IP。 ### 处理多层代理的情况 在实际部署中,客户端的请求可能经过多层代理服务器...
nginx取 $remote_addr 当做真实ip,而事实上,$http_X_Forwarded_For 才是用户真实ip,$remote_addr只是代理上一层的地址 解决方案: 在 http 模块 加 set_real_ip_from 172.17.10.125; #上一层代理IP地址 real_ip_...
本文将深入探讨“Nginx做反向代理时如何获取真实IP”的主题,这对于网站日志分析、安全监控以及实现个性化服务至关重要。 Nginx是一款流行的开源HTTP服务器,常用于反向代理、负载均衡和缓存服务。反向代理是指...
1. **配置Nginx获取真实IP** 在使用CDN的情况下,服务器接收到的客户端IP地址实际上是CDN节点的IP地址。可以通过特定的Nginx配置来获取客户端的真实IP地址: ```nginx http { proxy_set_header X-Real-IP $...
#### 二、获取真实IP的常用方法 1. **通过`$_SERVER`超全局变量** PHP提供了`$_SERVER`超全局变量来获取服务器端的各种信息,包括HTTP头部信息。我们可以利用这个特性来获取真实IP: ```php function ...
然而,如果应用部署在反向代理服务器如Nginx或Apache后面,`getRemoteAddr()`可能会返回代理服务器的IP而非用户的真实IP。为解决这个问题,我们可以检查`X-Forwarded-For`头,它通常会包含用户的原始IP地址: ```...
同样,如果在反向代理环境中,我们需要检查`X-Forwarded-For`头来获取真实的IP: ```java String forwardedFor = request.getHeaders().getFirst("X-Forwarded-For"); if (forwardedFor != null) { ipAddress = ...
解决该问题,需要在Nginx反向代理配置中添加一些配置信息,目的将客户端的真实IP和域名传递到应用程序中。同时,也要修改获取IP地址的方法。 但是需要注意的是,通过Nginx反向代理后,如果访问IP通过了几层代理,...
主要介绍了Java中使用HttpRequest获取用户真实IP地址,使用本文方法可以避免Apache、Squid、nginx等反向代理软件导致的非真实IP地址,需要的朋友可以参考下
在PHP开发中,获取用户公网IP(真实IP地址)是一个常见的需求,这通常涉及到网络通信和服务器配置。当我们使用PHP内置的全局数组`$_SERVER`中的`'REMOTE_ADDR'`来获取用户IP时,有时会发现它返回的是内网IP而非公网...
以下是对CDN加速时Nginx获取用户IP的配置方法的详细解释: 1. **使用CDN自定义IP头** 如果你的CDN提供商支持,可以在CDN的配置中设置一个自定义头部(如`remote-user-ip`),并将用户的原始IP地址赋值给它。在...
例如,`proxy_protocol`可以启用Nginx与上游服务器之间的代理协议,以便获取客户端的真实IP;`proxy_set_header`可以设置传递给后端服务器的头部信息。 总之,Nginx的TCP代理转发功能使得我们可以利用其强大的性能...
当我们构建一个基于Servlet的Web应用程序时,有时需要获取访问用户的真实IP地址,这在处理用户请求、日志记录或者实现地理位置相关的功能时尤为关键。 Servlet是Java服务器端的一种组件,它扩展了Web服务器的功能,...
然而,由于数据传输的路径经过多个CDN节点,这使得在CDN环境下获取用户的真实IP地址变得复杂。 "CDN下真实ip查询器"是一个专门针对这种情况设计的工具,它的主要功能是穿透CDN服务,准确地识别出用户的原始IP地址。...
以下是两种在JSP中获取真实IP地址的方法的详细说明: 方法一:使用X-Forwarded-For头信息 在多数情况下,真实客户端的IP地址会被包含在名为“X-Forwarded-For”的HTTP请求头中。这个头部由代理服务器在转发客户端...