php如何获取请求接口资源的请求者的IP地址
/
@param integer $type
@return mixed
/
function getclientip() {
static $realip = NULL;
if($realip !== NULL){
return $realip;
}
if(isset($_SERVER)){
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){ //但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 $_SERVER["HTTP_X_FORWARDED_FOR"] 来读取。
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
/ 取X-Forwarded-For中第一个非unknown的有效IP字符串 /
foreach ($arr AS $ip){
$ip = trim($ip);
if ($ip != 'unknown'){
$realip = $ip;
break;
}
}
}elseif(isset($_SERVER['HTTP_CLIENT_IP'])){//HTTP_CLIENT_IP 是代理服务器发送的HTTP头。如果是"超级匿名代理",则返回none值。同样,REMOTE_ADDR也会被替换为这个代理服务器的IP。
$realip = $_SERVER['HTTP_CLIENT_IP'];
}else{
if (isset($_SERVER['REMOTE_ADDR'])){ //正在浏览当前页面用户的 IP 地址
$realip = $_SERVER['REMOTE_ADDR'];
}else{
$realip = '0000';
}
}
}else{
//getenv环境变量的值
if (getenv('HTTP_X_FORWARDED_FOR')){//但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址
$realip = getenv('HTTP_X_FORWARDED_FOR');
}elseif (getenv('HTTP_CLIENT_IP')){ //获取客户端IP
$realip = getenv('HTTP_CLIENT_IP');
}else{
$realip = getenv('REMOTE_ADDR'); //正在浏览当前页面用户的 IP 地址
}
}
preg_match("/[\d\]{7,15}/", $realip, $onlineip);
$realip = !empty($onlineip[0]) $onlineip[0] : '0000';
return $realip;
}
理论上不可能获得真实的客户IP地址,只能获得最后一次路由器、或者代理服务器的IP地址。典型的情况是对方也在局域网、或者防火墙的后面,我们是不可能获得他真实的IP地址的,其实获取来也没有,一般是19216812这样的私有地址,甚至很可能所有的客户机都是这个网段。
这个跟你的路由设置和访问方式有关。
假设你的服务端在1010501,公网IP都是8888。
假设你的客户端在 101050100-199,出口公网IP是4444
如果你的客户端以公网的形式访问,如http://8888/ipphp,则服务端获得IP都是4444。
反之以内网的形式访问,如http://1010501/ipphp,获得的IP就是1010501XX。
解决的办法,要么就是使用内网地址访问,要么使用设置一下路由,指定101050100-199访问的话,不走公网,走10网段。
$user_IP = $_SERVER["REMOTE_ADDR"];//获取访问者IP
$file_name=date('Y-m-d')'txt'//以当前的日期建立txt文件
$file=fopen($file_name,"a+");//如果存在该文件就打开,如果不存在就创建
fwrite($file,$user_IP'--'date('Y-m-d H:i:s'));//将访问者IP及当前时刻写到文件最后
fclose($file);//关闭文件
//个人觉得txt文件不会很大所以一般无需一天一删除,因为在txt里删除一些行比起数据库要麻烦一些。
0条评论