最新公告
  • 欢迎访问代码工坊,购买产品可享受在线工单服务!
  • 帝国cms在开启cdn加速时无法获取用户真实ip和端口的解决方法

      帝国cms在开启了CDN之后,通过自带的egetip()、egetport()函数有可能无法获取到用户的真实ip和端口,而是获取的CDN服务器的IP地址,这个问题在百度云cdn、腾讯云cdn、阿里云cdn等都存在,端口为0。为此我们需要获取CDN厂商透传过来的用户IP、端口信息。

      以腾讯云cdn为例,首先腾讯云cdn的请求头会默认携带X-Forwarded-For(真实客户端 IP),我们只需要在服务器变量中直接获取这个参数即可,或者我们可以通过web组件的映射来实现,例如Nginx,通过realip模块,可以轻松实现用户真实ip的映射,在nginx的http配置中增加以下代码,就可以通过帝国cms原有的egetip()方法来获取真实ip了:

            set_real_ip_from 0.0.0.0/0;
            real_ip_header X-Forwarded-For;

      接下来是端口,我们首先需要在腾讯云cdn的回源配置中设置http请求头,新增规则,头部参数为X-Forward-Port,值为$remote_port,这样在请求头中就会出现HTTP_X_FORWARD_PORT,该参数的值就是用户的真实端口。

    帝国cms在开启cdn加速时无法获取用户真实ip和端口的解决方法

          但这样我们还无法直接通过帝国cms的egetport()接口来获取,我们打开/e/class/connect.php文件,搜索以下代码:

    function egetipport(){
    	$ipport=(int)$_SERVER['REMOTE_PORT'];
    	return $ipport;
    }

          替换为:

    function egetipport(){
    	$ipport=(int)$_SERVER['REMOTE_PORT'];
    	if(!$ipport){
    		$ipport=(int)$_SERVER['HTTP_X_FORWARD_PORT'];
    	}
    	return $ipport;
    }

          这样就可以获取用户的真实IP了。

    发表评论