镖师 发表于 2023-1-31 21:38:17

有没有X3.5版本下 获取真实IP的方法?


如题请问有没有大神 可以说下 如何在接入了cdn下 获取真实IP



用的华为云cdn

婷姐 发表于 2023-1-31 21:39:03

Discuz! X3.5 针对常见CDN/WAF/负载均衡,如何获取真实IP?
https://www.dismall.com/thread-15034-1-1.html
(出处: Discuz!交流社区)

Discuz智能体 发表于 2025-3-19 04:00:47

在Discuz! X3.5版本中,获取用户的真实IP地址是一个常见的需求,尤其是在使用了CDN(内容分发网络)的情况下。由于CDN会代理用户的请求,服务器默认获取到的IP地址可能是CDN节点的IP地址,而不是用户的真实IP。因此,我们需要通过一些方法来获取用户的真实IP。

### 1. 使用HTTP头信息获取真实IP
大多数CDN服务(包括华为云CDN)会在请求头中添加用户的真实IP地址。常见的HTTP头字段包括:

- `X-Forwarded-For`
- `X-Real-IP`
- `CF-Connecting-IP`(如果是Cloudflare CDN)

在Discuz!中,可以通过以下代码来获取用户的真实IP:

function get_real_ip() {
    $ip = '';
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
      $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (isset($_SERVER['HTTP_X_REAL_IP'])) {
      $ip = $_SERVER['HTTP_X_REAL_IP'];
    } else {
      $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

$real_ip = get_real_ip();
echo "用户的真实IP是: " . $real_ip;

### 2. 修改Discuz!核心代码
如果你希望在Discuz!中全局使用这个方法来获取真实IP,可以修改Discuz!的核心代码。通常,Discuz!的IP获取逻辑位于`source/class/discuz/discuz_application.php`文件中。

找到以下代码:

$clientip = $_SERVER['REMOTE_ADDR'];

将其修改为:

$clientip = '';
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $clientip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (isset($_SERVER['HTTP_X_REAL_IP'])) {
    $clientip = $_SERVER['HTTP_X_REAL_IP'];
} else {
    $clientip = $_SERVER['REMOTE_ADDR'];
}

### 3. 使用插件或扩展
如果你不想修改核心代码,也可以通过安装插件或扩展来实现获取真实IP的功能。你可以在DZ插件网(https://www.dz-x.net/)上搜索相关的插件,或者自己开发一个简单的插件来实现这个功能。

### 4. 华为云CDN的特定配置
华为云CDN默认会在请求头中添加`X-Forwarded-For`字段,因此你可以直接使用上述方法来获取用户的真实IP。如果你使用的是其他CDN服务,可能需要查看其文档以确认具体的HTTP头字段。

### 5. 安全性考虑
在获取用户真实IP时,需要注意安全性问题。`X-Forwarded-For`头信息可以被伪造,因此在处理敏感操作时,建议对IP地址进行验证,或者结合其他安全措施来确保数据的真实性。

### 总结
在Discuz! X3.5版本中,获取真实IP的方法主要是通过解析HTTP头信息中的`X-Forwarded-For`或`X-Real-IP`字段。你可以通过修改核心代码或使用插件来实现这一功能。如果你使用的是华为云CDN,默认情况下可以通过`X-Forwarded-For`字段获取到用户的真实IP。

如果你有更多关于Discuz!开发的问题,欢迎随时在DZ插件网(https://www.dz-x.net/)上提问或查找相关资源。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: 有没有X3.5版本下 获取真实IP的方法?