WordPress 透过 CDN 代理获取访客评论者真实 IP 地址

2021-11-21 11:46 390 8 条评论 龙笑天下

Wordpress 透过 CDN 代理获取访客评论者真实 IP 地址

今天龙笑天在编辑修改某评论时,突然发现评论修改完后,Wordpress会把原记录的评论者 IP 更新为评论编辑修改者的 IP,也就是评论者变为龙笑天的 IP 了...

WordPress 的这个评论者 IP 修改逻辑显然是不对的,经过沈唁志的测试,才发现是主题里的一个透过代理获取用户真实 IP 的钩子函数导致的问题...

钩子函数来自这里,需要修改为下面这样后才能行:

/**
 * WordPress 透过 CDN 代理获取访客评论者真实 IP 地址 - 龙笑天下
 * https://www.ilxtx.com/wordpress-get-real-comment-ip.html
 */
function dr_filter_get_real_comment_ip($comment_author_IP) {
    if( is_admin() ){
        return $comment_author_IP;
    }
    
    $REMOTE_ADDR = $_SERVER['REMOTE_ADDR'];

    // 使用 CloudFlare CDN
    if ( !empty($_SERVER['HTTP_CF_CONNECTING_IP']) ) {
        $HTTP_CF_CONNECTING_IP = explode(',', $_SERVER['HTTP_CF_CONNECTING_IP']);
        if (!empty($HTTP_CF_CONNECTING_IP)) {
            $REMOTE_ADDR = trim($HTTP_CF_CONNECTING_IP[0]);
        }
    }
 
    else if (!empty($_SERVER['X_FORWARDED_FOR'])) {
        $X_FORWARDED_FOR = explode(',', $_SERVER['X_FORWARDED_FOR']);
        if (!empty($X_FORWARDED_FOR)) {
            $REMOTE_ADDR = trim($X_FORWARDED_FOR[0]);
        }
    }
 
    /*
    * Some PHP environments will use the $_SERVER['HTTP_X_FORWARDED_FOR'] 
    * variable to capture visitor address information.
    */
    else if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $HTTP_X_FORWARDED_FOR= explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        if (!empty($HTTP_X_FORWARDED_FOR)) {
            $REMOTE_ADDR = trim($HTTP_X_FORWARDED_FOR[0]);
        }
    }
 
    return preg_replace('/[^0-9a-f:\., ]/si', '', $REMOTE_ADDR);
}
add_filter( 'pre_comment_user_ip', 'dr_filter_get_real_comment_ip');

友情提示,Dragon 主题已经修复了这个问题。

Dragon 主题:带用户中心和商城系统的博客 CMS 高级 Wordpress 主题 V4.7.0-BG
Dragon 主题:带用户中心和商城系统的博客 CMS 高级 Wordpress 主题 V4.7.0

Dragon 主题:带用户中心和商城系统的博客 CMS 高级 Wordpress 主题 V4.7.0

1 前言 Dragon 主题(演示网站:www.ilxtx.com),一款强大的多功能高级 Wordpress 商城会员主题,自适应响应式 HTML5+CSS3,兼容 Firefox、Chrome、...

WordPress 额外配置

根据 @老头 反馈,使用 CloudFlare 等 CDN 代理时,需要额外再修改 Wordpress 的配置文件 wp-config.php,在里面加入下面代码才能起效果:

// WordPress 使用 CDN 后获取访客真实 IP
if( !empty($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
    $get_HTTP_X_FORWARDED_FOR = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
    $_SERVER['REMOTE_ADDR'] = trim($get_HTTP_X_FORWARDED_FOR[0]);
}

其他参考

wordpress 使用 CDN 后获取访客真实 IP
NGINX,PHP 获取 Cloudflare 传递的真实访客 IP 配合宝塔面板防御 CC 攻击 防伪造 IP - 笨牛小白成长之路
CloudFlare 并通过 PHP 记录访问者 IP 地址 - ITranslater
Nginx 在 CDN 加速之后,获取用户真实 IP 做并发访问限制的方法 | 张戈博客
使用 CDN 之后如何找出用户的真实 IP 地址 - 燕闻墨香

「点点赞赏,手留余香」

还没有人赞赏,快来当第一个赞赏的人吧!

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

2021-08-04

2021-11-24

发表评论

表情 格式 贴图 链接 私密 签到
评论
正在努力加载中...
扫一扫二维码分享
×