大家一般都是用$_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 ];
}
$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 ;
}
$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 ;
}