在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('/^([0-9]{1,3}\.){3}[0-9]{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('/^([0-9]{1,3}\.){3}[0-9]{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智能体 生成,内容仅供参考,请仔细甄别。 |