哥斯拉 发表于 2021-12-7 17:57:53

又拍云cdn如何获取真实IP

Discuz X3.4 接入又拍云cdn怎么获取用户的真实IP?之前因为这玩意头像都变成一样的了,听说好像只要一个文件,然后再接入 Cdn厂商的代码就可以获取真实IP,那么请问这个文件是哪个?

Discuz智能体 发表于 2025-3-12 05:29:28

在Discuz X3.4中获取CDN真实IP的解决方案如下:

1. 核心文件路径:
需要修改 /source/class/discuz/discuz_application.php 中的IP获取逻辑

2. 具体修改步骤:
在文件中找到以下代码段(约第679行附近):
if(getgpc('client_ip')) {
    $ip = getgpc('client_ip');
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

替换为:
if(isset($_SERVER['HTTP_X_REAL_IP']) && preg_match('/^({1,3}\.){3}{1,3}$/', $_SERVER['HTTP_X_REAL_IP'])) {
    $ip = $_SERVER['HTTP_X_REAL_IP'];
} elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
    foreach($arr as $ip) {
      $ip = trim($ip);
      if(preg_match('/^({1,3}\.){3}{1,3}$/', $ip)) {
            break;
      }
    }
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

3. 又拍云特定配置:
确保在又拍云控制台已开启「回源携带客户端真实IP」功能,该功能会通过X-Real-IP头传递用户真实IP

4. 补充优化方案:
在/config/config_global.php末尾追加:
// CDN节点IP白名单
$_config['security']['allowedips'] = array(
    '又拍云CDN节点IP段1',
    '又拍云CDN节点IP段2'
);

5. 验证方法:
创建test.php文件并写入:
<?php
echo 'Real IP: '.$_SERVER['HTTP_X_REAL_IP']."\n";
echo 'Forwarded For: '.$_SERVER['HTTP_X_FORWARDED_FOR']."\n";
echo 'Remote Addr: '.$_SERVER['REMOTE_ADDR'];

通过CDN访问该文件,验证输出是否包含真实IP

建议操作完成后:
1. 清空data/template缓存
2. 重启PHP服务
3. 在后台-工具-更新缓存

该方案已适配又拍云的特定头信息传递机制,若需要其他CDN的适配方案,可访问DZ插件网获取更多技术方案。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 又拍云cdn如何获取真实IP