1. 学习php,用$_GET['REMOTE_ADDR']获取用户IP不成功
是$_SERVER里的,不是GET
直接用这个代码获取 吧,所有情况都考虑进去了。
$ip = !empty($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] :
(!empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] :
(!empty($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'unknown'));
2. php如何获取请求接口资源的请求者的IP地址
/**
*获取客户端IP地址
*@paraminteger$type
*@returnmixed
*/
functiongetclientip(){
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($arrAS$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='0.0.0.0';
}
}
}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]:'0.0.0.0';
return$realip;
}
3. php获取本机主板网卡IP地址.跳转读取相应的数据
大家一般都是用$_SERVER['REMOTE_ADDR']来获取用户IP,
但是如果使用了反向代理的,HTTP头中REMOTE_ADDR就不是用户的地址,反而是上一级代理的地址了。
经过我的研究有两种方法来获取用户的真实外网IP。
方法一:curl
复制代码代码如下:
function get_onlineip() {
$ch = curl_init('http://www.ip138.com/ip2city.asp');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$a = curl_exec($ch);
preg_match('/\[(.*)\]/', $a, $ip);
return $ip[1];
}
方法二:$_SERVER['HTTP_X_FORWARDED_FOR']来获取相应的地址
复制代码代码如下:
function get_onlineip() {
$onlineip = '';
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'];
}
return $onlineip;
}
4. 网站通过SSL加密,PHP如何获取用户的真实IPREMOTE_ADDR获得的只是局域网IP。急急急 在线等
这个和SSL加密没有关系的
<?php
// 定义一个函数getIP()
function getIP()
{
global $ip;
if (getenv("HTTP_CLIENT_IP"))
$ip = getenv("HTTP_CLIENT_IP");
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
else
$ip = "Unknow";
return $ip;
}
// 使用方法:
echo getIP();
?>
getenv("REMOTE_ADDR")用来取得客户端的 IP 地址,但如果客户端是使用代理服务器来访问,那取到的就是代理服务器的 IP 地址,而不是真正的客户端 IP 地址。要想透过代理服务器取得客户端的真实 IP 地址,就要使用 getenv("HTTP_X_FORWARDED_FOR") 来读取。
但是如果客户端没有通过代理服务器来访问,那么用getenv("HTTP_X_FORWARDED_FOR") 取到的值将是空的。
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
表示如果getenv("HTTP_X_FORWARDED_FOR") 取到的值存在不为空(即客户端使用代理服务器的情况下),则变量$ip等于getenv("HTTP_X_FORWARDED_FOR") 取到的真实IP值。
如果上面的else if(getenv("HTTP_X_FORWARDED_FOR"))取得的值为空(即没有使用代理服务器),则不会执行下面的$ip = getenv("HTTP_X_FORWARDED_FOR");这一行语句。
这种情况下已经确认客户端没有使用代理服务器,从而通过
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
这两行语句获得客户端的IP地址也是真实的IP地址。