博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CDN下nginx获取用户真实IP地址
阅读量:7042 次
发布时间:2019-06-28

本文共 1403 字,大约阅读时间需要 4 分钟。

hot3.png

什么是remote_addr
remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。
什么是x_forwarded_for
正如上面所述,当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做x_forwarded_for的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP
1、使用CDN自定义IP头来获取
像cloudflare会增加一个"HTTP_CF_CONNECTING_IP"的http头
在php中可以使用$_SERVER["HTTP_CF_CONNECTING_IP"]来获取值
2、通过HTTP_X_FORWARDED_FOR获取IP地址
一般情况下CDN服务器都会传送HTTP_X_FORWARDED_FOR头,这是一个用逗号分隔的ip串,截取字符串第一个不为unkown的IP作为用户真实IP地址
在php中可以使用$_SERVER["HTTP_CF_CONNECTING_IP"]来获取值,获取第一个值为真实ip
3、使用nginx自带模块realip获取用户IP地址
首先需要nginx有realip模块
配置信息如下
server{    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;//ip串    real_ip_recursive on;    ...}
参数解释:
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
然后赋值到remote_addr变量
三种在CDN环境下获取用户IP方法总结
1、CDN自定义header头
优点:获取到最真实的用户IP地址,用户绝对不可能伪装IP
缺点:需要CDN厂商提供
2、获取x-forwarded-for头
优点:可以获取到用户的IP地址
缺点:程序需要改动,以及用户IP有可能是伪装的
3、使用realip获取
优点:程序不需要改动,直接使用remote_addr即可获取IP地址
缺点:ip地址有可能被伪装,而且需要知道所有CDN节点的ip地址或者ip段

转载于:https://my.oschina.net/liufeng815/blog/473253

你可能感兴趣的文章
ARC078 D.Fennec VS. Snuke(树上博弈)
查看>>
.Solr构建索引-查询索引
查看>>
centos服务器删除/usr目录怎么办
查看>>
在linux下使用curl访问 多参数url GET参数问题
查看>>
BZOJ3714:[PA2014]Kuglarz(最小生成树)
查看>>
when you debug and add breakpoints but pthread_setschedparam occurs!
查看>>
HashMap
查看>>
安装Pyecharts与ta-lib包
查看>>
html~table、table cell的使用
查看>>
PHP in_array效率问题
查看>>
Spring使用RowMapper将数据中的每一行封装成用户定义的类
查看>>
源代码的下载和编译
查看>>
树莓派+语音控制
查看>>
移动端开发 rem 单位使用问题
查看>>
ASP.net 学习路线(详细)
查看>>
命令行的提示位置
查看>>
(转)GMap.Net开发之自定义Marker使用方法
查看>>
答疑解惑之nginx
查看>>
iOS - 用过的UI自动化测试工具
查看>>
tcpdump命令
查看>>