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地址。