服务器客户使用CDN后,获取真实IP办法 (127.0.0.1)
一诺网络科技(www.enuoidc.com)的服务器,云服务器等客户登录后台管理,一般都会获取用户客户端地址并记录数据库.但相同程序部署我司虚拟主机后,获取客户端地址不是用户真实ip地址或为"127.0.0.1",可以通过以下方式修改获取客户ip地址部分代码解决.
Supesite使用CDN后获取真实IP办法
include/main.inc.php文件,这部分
if(getenv('HTTP_CLIENT_IP')&&strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown')){$_SGLOBAL['onlineip']=getenv('HTTP_CLIENT_IP');}elseif(getenv('HTTP_X_FORWARDED_FOR')&&strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown')){$_SGLOBAL['onlineip']=getenv('HTTP_X_FORWARDED_FOR');}elseif(getenv('REMOTE_ADDR')&&strcasecmp(getenv('REMOTE_ADDR'),'unknown')){$_SGLOBAL['onlineip']=getenv('REMOTE_ADDR');}elseif(isset($_SERVER['REMOTE_ADDR'])&&$_SERVER['REMOTE_ADDR']&&strcasecmp($_SERVER['REMOTE_ADDR'],'unknown')){$_SGLOBAL['onlineip']=$_SERVER['REMOTE_ADDR'];}
替换成
functionget_real_ip(){$ip=false;if(!empty($_SERVER["HTTP_CLIENT_IP"])){$ip=$_SERVER["HTTP_CLIENT_IP"];}if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){$ips=explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']);if($ip){array_unshift($ips,$ip);$ip=FALSE;}for($i=0;$i Discuz!使用CDN后获取真实IP办法 nclude/common.inc.php找到如下代码: if(getenv('HTTP_CLIENT_IP')&&strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown')){$onlineip=getenv('HTTP_CLIENT_IP');}elseif(getenv('HTTP_X_FORWARDED_FOR')&&strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown')){$onlineip=getenv('HTTP_X_FORWARDED_FOR');}elseif(getenv('REMOTE_ADDR')&&strcasecmp(getenv('REMOTE_ADDR'),'unknown')){$onlineip=getenv('REMOTE_ADDR');}elseif(isset($_SERVER['REMOTE_ADDR'])&&$_SERVER['REMOTE_ADDR']&&strcasecmp($_SERVER['REMOTE_ADDR'],'unknown')){$onlineip=$_SERVER['REMOTE_ADDR'];}
替换为: functionget_real_ip(){$ip=false;if(!empty($_SERVER["HTTP_CLIENT_IP"])){$ip=$_SERVER["HTTP_CLIENT_IP"];}if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){$ips=explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']);if($ip){array_unshift($ips,$ip);$ip=FALSE;}for($i=0;$i {$ip=$ips[$i];break;}}}return($ip?$ip:$_SERVER['REMOTE_ADDR']);}$onlineip=get_real_ip();
帝国cms后台记录的ip日志和用户注册记录的ip \e\class\connect.php搜索functionegetip()函数中的获取ip代码修改成以上部分
IP相同的解决办法方法A:register.php200行showmessage('register_invite_iperror');改为//showmessage('register_invite_iperror');方法B:在include/common.inc.php文件中把代码: if(getenv('HTTP_CLIENT_IP')&&strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown')){$onlineip=getenv('HTTP_CLIENT_IP');}elseif(getenv('HTTP_X_FORWARDED_FOR')&&strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown')){$onlineip=getenv('HTTP_X_FORWARDED_FOR');}elseif(getenv('REMOTE_ADDR')&&strcasecmp(getenv('REMOTE_ADDR'),'unknown')){$onlineip=getenv('REMOTE_ADDR');}elseif(isset($_SERVER['REMOTE_ADDR'])&&$_SERVER['REMOTE_ADDR']&&strcasecmp($_SERVER['REMOTE_ADDR'],'unknown')){$onlineip=$_SERVER['REMOTE_ADDR'];} 替换成:代码:$onlineip=getenv('HTTP_X_FORWARD_FOR'); -------------------- 做了CDN的ASP网站如何取到用户真实IP程序 functioncheckip(checkstring)'用正则判断IP是否合法dimre1setre1=newRegExpre1.pattern="^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$"re1.global=falsere1.Ignorecase=falsecheckip=re1.test(checkstring)setre1=nothingendfunction functionget_cli_ip()'取真实IP函数,先HTTP_CLIENT_IP再HTTP_X_FORWARDED_FOR再REMOTE_ADDRdimclient_ipifcheckip(Request.ServerVariables("HTTP_CLIENT_IP"))=truethenget_cli_ip=checkip(Request.ServerVariables("HTTP_CLIENT_IP"))elseMyArray=split(Request.ServerVariables("HTTP_X_FORWARDED_FOR"),",")ifubound(MyArray)>=0thenclient_ip=trim(MyArray(0))ifcheckip(client_ip)=truethenget_cli_ip=client_ipexitfunctionendifendifget_cli_ip=Request.ServerVariables("REMOTE_ADDR")endifendfunction
服务端: //方法一HttpContext.Current.Request.UserHostAddress;//方法二HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];//方法三stringstrHostName=System.Net.Dns.GetHostName();stringclientIPAddress=System.Net.Dns.GetHostAddresses(strHostName).GetValue(0).ToString();//方法四(无视代理)HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 客户端: //方法五varip='';alert("YourIPaddressis"+ip);//方法六(无视代理)functionGetLocalIPAddress(){varobj=null;varrslt="";try{obj=newActiveXObject("rcbdyctl.Setting");rslt=obj.GetIPAddress;obj=null;}catch(e){//}returnrslt;} 来自印度的MCTMaulikPatel提供了一种服务端的解决方案,很好:
if(Context.Request.ServerVariables["HTTP_VIA"]!=null)//usingproxy{ip=Context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();//ReturnrealclientIP.}else//notusingproxyorcan'tgettheClientIP{ip=Context.Request.ServerVariables["REMOTE_ADDR"].ToString();//Whileitcan'tgettheClientIP,itwillreturnproxyIP.}备注: 1.有些代理是不会发给我们真实IP地址的 2.有些客户端会因为“header_accessdeny”的安全设置而不发给我们IP