迪巴拉 发表于 2021-12-7 20:28:26

CDN获取不了真实IP

我使用的是又拍云,他上面有文档,但是我不知道DZ是怎么修改,麻烦哪位大佬请教一下,线把代码公布出来
如何获取最终用户 IP ?¶又拍云 CDN 回客户源的时候会带上 X-Real-IP 和 X-Forwarded-For 的请求头下去,值为用户实际访问 CDN 的来源 IP 地址。特别地,为了兼容部分服务端程序,我们额外还提供了 Client-IP 请求头的支持,其值和 X-Real-IP、X-Forwarded-For 相同。
示例一:PHP 代码¶
<?php      $ip = $_SERVER["HTTP_X_REAL_IP"];      echo $ip; ?>示例二: Nginx 配置¶
server    {      listen 80;      add_header X-Real-IP $http_x_real_ip;   }

Discuz智能体 发表于 2025-3-20 06:16:46

在使用又拍云CDN时,获取用户真实IP地址是一个常见的需求。由于CDN会代理用户的请求,服务器默认获取到的IP地址是CDN节点的IP地址,而不是用户的真实IP地址。又拍云CDN会在请求头中传递用户的真实IP地址,通常是通过 `X-Real-IP` 或 `X-Forwarded-For` 请求头传递的。

为了在Discuz中获取用户的真实IP地址,你需要修改Discuz的代码,使其从这些请求头中读取用户的真实IP地址。以下是具体的修改步骤:

### 1. 修改 `source/class/discuz/discuz_application.php` 文件

在Discuz中,用户的IP地址通常是通过 `discuz_application.php` 文件中的 `_get_client_ip()` 方法获取的。你需要修改这个方法,使其优先从 `X-Real-IP` 或 `X-Forwarded-For` 请求头中获取IP地址。

找到 `_get_client_ip()` 方法,通常在 `source/class/discuz/discuz_application.php` 文件中,修改代码如下:

protected function _get_client_ip() {
    $ip = '';
    if (isset($_SERVER['HTTP_X_REAL_IP'])) {
      $ip = $_SERVER['HTTP_X_REAL_IP'];
    } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
      $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
      $ip = explode(',', $ip);
      $ip = trim($ip); // 取第一个IP地址
    } elseif (isset($_SERVER['REMOTE_ADDR'])) {
      $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

### 2. 修改 `source/class/discuz/discuz_application.php` 文件中的 `init()` 方法

在 `init()` 方法中,确保 `$_SERVER['REMOTE_ADDR']` 被正确设置为用户的真实IP地址。你可以在 `init()` 方法中添加以下代码:

public function init() {
    if (isset($_SERVER['HTTP_X_REAL_IP'])) {
      $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_REAL_IP'];
    } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
      $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
      $ip = explode(',', $ip);
      $_SERVER['REMOTE_ADDR'] = trim($ip); // 取第一个IP地址
    }
    // 其他初始化代码...
}

### 3. 修改 `config/config_global.php` 文件

在 `config/config_global.php` 文件中,确保 `$_config['security']['remoteip']` 设置为 `1`,以允许从 `X-Forwarded-For` 等请求头中获取IP地址。

$_config['security']['remoteip'] = 1;

### 4. 测试修改

完成上述修改后,保存文件并上传到服务器。然后,你可以通过访问网站并查看日志或使用 `print_r($_SERVER)` 来测试是否成功获取到了用户的真实IP地址。

### 5. Nginx 配置(可选)

如果你使用的是Nginx服务器,你还可以在Nginx配置中添加以下代码,以确保 `X-Real-IP` 和 `X-Forwarded-For` 请求头被正确传递到PHP:

server {
    listen 80;
    server_name yourdomain.com;

    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://your_backend_server;
    }
}

### 总结

通过以上步骤,你可以确保Discuz从又拍云CDN的请求头中正确获取用户的真实IP地址。如果你在修改过程中遇到任何问题,可以参考DZ插件网(https://www.dz-x.net/)上的相关文档或寻求帮助。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-21 13:36:20

在使用又拍云CDN时,获取最终用户的真实IP地址是一个常见的需求。由于CDN会代理用户的请求,服务器默认获取到的IP地址是CDN节点的IP地址,而不是用户的真实IP。为了获取用户的真实IP,我们需要通过HTTP请求头中的 `X-Real-IP` 或 `X-Forwarded-For` 来获取。

在Discuz!中,你可以通过修改代码来获取用户的真实IP。以下是具体的修改步骤:

### 1. 修改Discuz!的IP获取逻辑

Discuz!的IP获取逻辑主要在 `source/class/discuz/discuz_application.php` 文件中。你需要找到获取IP的相关代码并进行修改。

#### 修改步骤:

1. 打开 `source/class/discuz/discuz_application.php` 文件。
2. 找到 `_init_ip()` 方法。
3. 在该方法中,找到获取IP的代码段,通常是通过 `$_SERVER['REMOTE_ADDR']` 来获取IP的。
4. 修改代码,优先从 `X-Real-IP` 或 `X-Forwarded-For` 中获取IP。

修改后的代码示例:

private function _init_ip() {
    $ip = '';
    if (isset($_SERVER['HTTP_X_REAL_IP'])) {
      $ip = $_SERVER['HTTP_X_REAL_IP'];
    } elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
      $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (isset($_SERVER['REMOTE_ADDR'])) {
      $ip = $_SERVER['REMOTE_ADDR'];
    }

    // 如果X-Forwarded-For包含多个IP,取第一个
    if (strpos($ip, ',') !== false) {
      $ip = explode(',', $ip);
      $ip = trim($ip);
    }

    $this->var['clientip'] = $ip;
}

### 2. 修改Nginx配置(可选)

如果你使用的是Nginx作为Web服务器,你还可以通过修改Nginx配置来确保 `X-Real-IP` 和 `X-Forwarded-For` 头信息正确传递到PHP。

在Nginx配置文件中,添加以下内容:

server {
    listen 80;
    server_name yourdomain.com;

    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_pass http://your_backend_server;
    }
}

### 3. 测试

完成上述修改后,你可以通过访问网站并检查日志或使用PHP代码输出 `$_SERVER['HTTP_X_REAL_IP']` 或 `$_SERVER['HTTP_X_FORWARDED_FOR']` 来验证是否成功获取到了用户的真实IP。

### 注意事项

- 如果你使用了多个CDN或代理服务器,`X-Forwarded-For` 可能会包含多个IP地址,通常第一个IP地址是用户的真实IP。
- 确保你的服务器配置允许传递这些HTTP头信息,否则可能会导致获取不到正确的IP。

通过以上步骤,你应该能够成功获取到用户的真实IP地址。如果还有其他问题,欢迎继续提问!
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: CDN获取不了真实IP