套了两层CDN,发现无法获取真实IP,研究了下,可以如下设置
一、单层CDN获取真实IP
单层CDN是通用的,在PHP打印了全局变量$_SERVER,其中有REMOTE_ADDR、HTTP_X_FORWARDED_FOR两个参数里存了IP
什么是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。
此时只需要在NGINX配置文件中http部分增加如下内容即可
set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For;
二、增加CloudFlare多层CDN套娃获取真实IP
开启CloudFlare会在$_SERVER中增加一个新的参数,HTTP_CF_CONNECTING_IP,该参数中存了真实IP此时只需要调整real_ip_header即可
set_real_ip_from 0.0.0.0/0; real_ip_header CF-Connecting-IP;
三、ngx_http_realip_module 模块有如下三个指令
1. set_real_ip_from
- 该指令用于设置授信 IP,即请求过来时由某个头字段携带的 IP 中 nginx 自己认为可信的 IP,该头字段由 real_ip_header 指令指定;
- 该指令值一般是前几层代理的 IP ;
2. real_ip_header
- 该指令用于告知 nginx 从每个客户端请求中的哪个头字段来获取客户端真实的 IP;
- 该指令默认值是 X-Real-IP,不过现在主流的都是通过 X-Forwarded-For 字段来获取客户端真实 IP,X-Forwarded-For 目前已经是主流运用的字段了;
- 我们也可以在 nginx 配置时自定义一个新的字段;
3. real_ip_recursive
- nginx 从 real_ip_header 指令指定的头字段中获取 IP,可能会有多个 IP 值;
- 当 real_ip_recursive 指令值为 off,nginx 从获取到 IP 值中从右往左(也即从后往前)的顺序,以最后一个 IP 值作为客户端的真实 IP ,此时不会排除授信 IP;
- 当 real_ip_recursive 指令值为 on,nginx 从获取到 IP 值中从右往左(也即从后往前)的顺序,排除 set_real_ip_from 指令指定的授信 IP,以最后一个非授信 IP 值作为客户端的真实 IP ;
本文作者:𝙕𝙆𝘾𝙊𝙄
文章名称:同时使用CloudFlare和百度云加速多层CDN如何获取用户真实IP?
文章链接:https://www.zkcoi.com/365up/program/2447.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。