使用nginx自带模块realip获取用户IP地址
3.使用nginx自带模块realip获取用户IP地址
安装nginx之时加上realip模块,我的参数如下:
./configure --prefix=/usr/local/nginx-1.4.1--with-http_realip_module
真实服务器nginx配置
listen80;
server_name www.ttlsa.com;
access_log /data/logs/nginx/www.ttlsa.com.access.logmain;
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_from192.168.50.0/24;
set_real_ip_from61.22.22.22;
set_real_ip_from121.207.33.33;
set_real_ip_from127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursiveon;
fastcgi_pass unix:/var/run/phpfpm.sock;
fastcgi_index index.php;
includefastcgi.conf;
}
}
getRealip.php内容
<?php
$ip = $_SERVER['REMOTE_ADDR'];
echo$ip;
?>
访问www.ttlsa.com/getRealip.php,返回:
120.22.11.11
如果注释 real_ip_recursive on或者 real_ip_recursive off
访问www.ttlsa.com/getRealip.php,返回:
121.207.33.33
很不幸,获取到了中继的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_from192.168.50.0/24;
set_real_ip_from127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursiveon;
访问结果如下:
121.207.33.33
4、三种在CDN环境下获取用户IP方法总结
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
缺点:需要CDN厂商提供
优点:可以获取到用户的IP地址
缺点:程序需要改动,以及用户IP有可能是伪装的
优点:程序不需要改动,直接使用remote_addr即可获取IP地址
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段