公告
  
欢迎回来!目前网站流量日益增多服务器负载太大,迫不得已开启邀请码注册,此为赞助,所得费用来续费服务器,感谢支持

朕已阅

PHP获取访问者真实IP,邮箱及IP正则验证

admin 绿软之家站长 关注 网站管理员 76级
发表于技术杂文版块

在没有开代理服务器的情况下,直接使用:


$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;
}

评论列表 评论
发布评论

评论: PHP获取访问者真实IP,邮箱及IP正则验证

(0) 收藏文章
已有0次打赏