PHP获取访问者真实IP,邮箱及ip正则验证
在没有开代理服务器的情况下,直接使用:
$ip=$_SERVER["REMOTE_ADDR"];
如果客户端是使用代理服务器来访问,那取到的就是代理服务器的IP地址,而不是真正的客户端IP地址,反之就是真实IP;
下面是通用的一种写法,都能获取到:
要想透过代理服务器取得客户端的真实IP地址,就要使用getenv("HTTP_X_FORWARDED_FOR")来读取。
但是如果客户端没有通过代理服务器来访问,那么用getenv("HTTP_X_FORWARDED_FOR")取到的值将是空的。
functiongetIP() { static$realip; if(isset($_SERVER)){ if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])){ $realip=$_SERVER["HTTP_X_FORWARDED_FOR"]; }elseif(isset($_SERVER["HTTP_CLIENT_IP"])){ $realip=$_SERVER["HTTP_CLIENT_IP"]; }else{ $realip=$_SERVER["REMOTE_ADDR"]; } }else{ if(getenv("HTTP_X_FORWARDED_FOR")){ $realip=getenv("HTTP_X_FORWARDED_FOR"); }elseif(getenv("HTTP_CLIENT_IP")){ $realip=getenv("HTTP_CLIENT_IP"); }else{ $realip=getenv("REMOTE_ADDR"); } } return$realip; }
注意:
$_SERVER和getenv的区别,getenv不支持IIS的isapi方式运行的php
getenv(“REMOTE_ADDR”)函数在apache下能正常获取ip地址,而在iis中没有作用,而$_SERVER['REMOTE_ADDR']函数,既可在apache中成功获取访客的ip地址,在iis下也同样有效
另外根据ip地址,可以实现类似限制IP访问的防刷机制;
//方法1:
$ip=$_SERVER["REMOTE_ADDR"]; echo$ip;
//方法2:
$user_IP=($_SERVER["HTTP_VIA"])?$_SERVER["HTTP_X_FORWARDED_FOR"]:$_SERVER["REMOTE_ADDR"]; $user_IP=($user_IP)?$user_IP:$_SERVER["REMOTE_ADDR"]; echo$user_IP; //方法3: functiongetRealIp() { $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<count($ips);$i++){ if(!eregi("^(10│172.16│192.168).",$ips[$i])){ $ip=$ips[$i]; break; } } } return($ip?$ip:$_SERVER['REMOTE_ADDR']); }
echogetRealIp();
//方法4:
if($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]) { $ip=$HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]; } elseif($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]) { $ip=$HTTP_SERVER_VARS["HTTP_CLIENT_IP"]; } elseif($HTTP_SERVER_VARS["REMOTE_ADDR"]) { $ip=$HTTP_SERVER_VARS["REMOTE_ADDR"]; } elseif(getenv("HTTP_X_FORWARDED_FOR")) { $ip=getenv("HTTP_X_FORWARDED_FOR"); } elseif(getenv("HTTP_CLIENT_IP")) { $ip=getenv("HTTP_CLIENT_IP"); } elseif(getenv("REMOTE_ADDR")) { $ip=getenv("REMOTE_ADDR"); } else { $ip="Unknown"; } echo$ip;
//方法5:
if(getenv('HTTP_CLIENT_IP')){ $onlineip=getenv('HTTP_CLIENT_IP'); }elseif(getenv('HTTP_X_FORWARDED_FOR')){ $onlineip=getenv('HTTP_X_FORWARDED_FOR'); }elseif(getenv('REMOTE_ADDR')){ $onlineip=getenv('REMOTE_ADDR'); }else{ $onlineip=$HTTP_SERVER_VARS['REMOTE_ADDR']; } echo$onlineip; php验证邮箱,代码如下: $email='fengdingbo@gmail.com'; $result=filter_var($email,FILTER_VALIDATE_EMAIL); var_dump($result);//string(20)"fengdingbo@gmail.com" php验证url地址,代码如下: $url="https://www.jb51.net"; $result=filter_var($url,FILTER_VALIDATE_URL); var_dump($result);//string(25)"https://www.jb51.net" php验证ip地址,代码如下: $url="192.168.1.110"; $result=filter_var($url,FILTER_VALIDATE_IP); var_dump($result);//string(13)"192.168.1.110"
//该方法也可以用来验证ipv6。
$url="2001:DB8:2de::e13"; $result=filter_var($url,FILTER_VALIDATE_IP); var_dump($result);//string(17)"2001:DB8:2de::e13" publicstaticfunctionisEmail($email) { returnpreg_match("/^([a-z0-9]*[-_\.]?[a-z0-9]+)*@([a-z0-9]*[-_]?[a-z0-9]+)+[\.][a-z]{2,4}([\.][a-z]{2})?$/i",$email); } publicstaticfunctionisNumber($num) { returnis_numeric($num); } publicstaticfunctionisUrl($url,$preg=false) { if($preg) { $status=preg_match("/^([^:\/\/])+\:\/\/[\w-]+\.[\w-.\?\/]+$/",$url); } else { $status=filter_var($url,FILTER_VALIDATE_URL); } return$status; }