php如何获取真实ip
试了网上很多代码都不行,但是ip138每次都能显示我的真实ip。特求各位大侠支招。
比如我用一般的php获得的我的ip地址是:60.55.8.229 - 浙江宁波
但是ip38.com获取的我的ip地址是:[42.196.192.67] 来自:上海市 长城宽带
ip138才是正确的。
我在医院里测试也是这样,自己的php代码获取的ip是浙江杭州
但是ip138却能获得我的真实ip,上海交通大学
我现在用的php代码如下:
function getip(){
if (getenv(http_client_ip) && strcasecmp(getenv(http_client_ip), unknown))
$ip = getenv(http_client_ip);
else if (getenv(http_x_forwarded_for) && strcasecmp(getenv(http_x_forwarded_for), unknown))
$ip = getenv(http_x_forwarded_for);
else if (getenv(remote_addr) && strcasecmp(getenv(remote_addr), unknown))
$ip = getenv(remote_addr);
else if (isset($_server['remote_addr']) && $_server['remote_addr'] && strcasecmp($_server['remote_addr'], unknown))
$ip = $_server['remote_addr'];
else
$ip = unknown;
return($ip);
}
echo getip();
------解决方案--------------------
呃是我的方法:
function curip(){
$ip='';
if(getenv('http_client_ip') and strcasecmp(getenv('http_client_ip'),'unknown')){
$ip=getenv('http_client_ip');
}elseif(getenv('http_x_forwarded_for') and strcasecmp(getenv('http_x_forwarded_for'),'unknown')){
$ip=getenv('http_x_forwarded_for');
}elseif(getenv('remote_addr')and strcasecmp(getenv('remote_addr'),'unknown')){
$ip=getenv('remote_addr');
}elseif(isset($_server['remote_addr']) and $_server['remote_addr'] and strcasecmp($_server['remote_addr'],'unknown')){
$ip=$_server['remote_addr'];
}else{
$ip='127.0.0.1';
}
return $ip;
}
------解决方案--------------------
function real_ip()
{
static $realip = null;
if ($realip !== null)
{
return $realip;
}
if (isset($_server))
{
if (isset($_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']))
{
$realip = $_server['http_client_ip'];
}
else
{
if (isset($_server['remote_addr']))
{
$realip = $_server['remote_addr'];
}
else
{
$realip = '0.0.0.0';
}
}
}
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');
}
}
$onlineip = null;
preg_match(/[\d\.]{7,15}/, $realip, $onlineip);
$realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';
return $realip;
}
------解决方案--------------------