首页 话题 小组 问答 好文 用户 我的社区 域名交易 唠叨

[教程]xiuno网站使用CDN后获取真实IP教程

发布于 2025-05-03 18:37:25
0
78

首先,需修改配置文件conf/conf.php  ,修改 'cdn_on' => 0  为  'cdn_on' => 1,一般情况下即可正确获取真实IP。

如果不行,因为xiuno默认使用不安全的获取IP方式,部分情况下载无法准确获取CDN传递的真实IP,因此需要修改文件:

xiunophp/misc.func.php  ,位置531行处,注释掉代码段


/*function ip() {
    $conf = _SERVER('conf');
    $ip = '127.0.0.1';
    if(empty($conf['cdn_on'])) {
        $ip = _SERVER('REMOTE_ADDR');
    } else {
        if(isset($_SERVER['HTTP_CDN_SRC_IP'])) {
            $ip = $_SERVER['HTTP_CDN_SRC_IP'];
        } elseif(isset($_SERVER['HTTP_CLIENTIP'])) {
            $ip = $_SERVER['HTTP_CLIENTIP'];
        } elseif(isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            $arr = array_filter(explode(',', $ip));
            $ip = trim(end($arr));
        } else {
            $ip = _SERVER('REMOTE_ADDR');
        }
    }
    return long2ip(ip2long($ip));
}*/

去掉555行函数的注释,如下:


// 安全获取用户IP,信任 CDN 发过来的 X-FORWARDED-FOR
function ip() {
    global $conf;
    $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1'; // 如果有 CDN 的时候,为离服务器最近的 IP
    if(empty($conf['cdn_ip']) || empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        return $ip;
    } else {
        // 判断 cdnip 合法性,严格过滤 HTTP_X_FORWARDED_FOR
        // X-Forwarded-For: client1, proxy1, proxy2, ...
        // 离服务器最最近的为最后一个 proxy2,应该在 $conf['cdn_ip'] 当中才安全可信
        foreach($conf['cdn_ip'] as $cdnip) {
            $pos1 = strrpos($cdnip, '.');
            $pos2 = strrpos($ip, '.');
            // 合法 CDN IP 段
            if($ip == $cdnip || ($pos1 == $pos2 && substr($cdnip, $pos1) == '.*' && substr($cdnip, 0, $pos1) == substr($ip, 0, $pos2))) {
                $userips = !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['HTTP_X_REAL_IP'];
                if(empty($userips)) return $ip; // 此处 CDN 未转发 userip,有错误,可能需要记录日志
                $arr = array_values(array_filter(explode(',', $userips)));
                return long2ip(ip2long(end($arr)));
            }
        }
        return $ip;
    }
}
// 日志记录

然后保存并更新缓存,即可获取CDN传递的用户真实IP地址了。

评论
一个月内的热帖推荐
啊龙
Lv.1普通用户

9545

帖子

31

小组

3242

积分

赞助商广告
站长交流