cdn背后网站获取真实ip

最近网站上CDN,但上CDN的同时,还有很多来自国外的流量的攻击,需要统计攻击的ip,加入黑名单.在cdn后面的网站如果按照传统的方法,只能获取到cdn服务器的ip,所以需要查看cdn服务商提供的文档和实测结果

PHP超全局变量$_SERVER

<?php
// 原有获取访问者ip方法
// 流量经过cdn后只能通过该字段获得cdn的ip
echo $_SERVER['REMOTE_ADDR'];

cdn实测结果

  • 在配置cdn的情况下输出全局变量,查看ip输出情况
<?php
print_r($_SERVER);

百度CDN打印结果

Array
(   
    [HTTP_X_FORWARDED_FOR] => 119.164.27.53,123.234.0.103,27.221.124.94
    [HTTP_X_REAL_IP] => 119.164.27.53
    [REMOTE_ADDR] => 150.138.138.169
    .........
)

阿里CDN打印结果

Array
(
    [HTTP_ALI_CDN_REAL_IP] => 119.164.27.53
    [HTTP_X_FORWARDED_FOR] => 119.164.27.53
    [REMOTE_ADDR] => 115.124.31.68
    .........
)

七牛CDN打印结果

Array
(
    [HTTP_ALI_CDN_REAL_IP] => 119.164.27.53
    [HTTP_X_FORWARDED_FOR] => 119.164.27.53
    [REMOTE_ADDR] => 182.92.246.161
    .........
)

又拍云CDN打印结果

Array
(
    [HTTP_X_FORWARDED_FOR] => 119.164.27.53
    [HTTP_X_REAL_IP] => 119.164.27.53
    [REMOTE_ADDR] => 150.138.216.79
    .........
)

未使用CDN关于IP字段

Array
(
    [REMOTE_ADDR] => 119.164.27.53
)
  1. 在使用CDN时,$_SERVER变量中就会含有HTTP_X_FORWARDED_FOR元素,并且它里面含有用户的真实IP地址
  2. 未使用CDN时,$_SERVER变量中不会出现HTTP_X_FORWARDED_FOR元素
  3. 百度CDN下,HTTP_X_FORWARDED_FOR元素中是多个IP地址,并用英文逗号分开,第一个为用户的真实IP地址

PHP获取网站使用CDN加速下用户真实的IP地址代码

<?php
function GetUserIP(){
    if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
        //为了兼容百度的CDN,所以转成数组
        $arr = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
        return $arr[0];
    }else{
        return $_SERVER['REMOTE_ADDR'];
    }
}

解决cdn后端获取真实ip:https://www.feiniaomy.com/post/377.html