比如我用一般的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();
回复讨论(解决方案) 没研究过,我也想了解下。
期待楼下给出答案
http://iframe.ip138.com/ic.asp
或许asp有神奇的函数?
?是我的方法:
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;
}
无论你们的代码有多么复杂,但都是依次检查
http_client_ip
http_x_forwarded_for
remote_addr
是否存在,且一旦有一个存在就结束
但需要注意的是:http_client_ip 和 http_x_forwarded_for 都是可程序的
比如
$ip = '888.888.888.888';
curl_setopt($ch,curlopt_httpheader,array(x-forwarded-for:$ip,client-ip:$ip));
那你们的代码都会认为 ip 为 888.888.888.888
显然这是在开玩笑
remote_addr 始终反映出接入网络的第一级路由的 ip,这才是真实的 ip
真实? 不可能 我一个代理 你就傻了~
要突破代理 ... 还真是个问题 需要其他技术 php 不好实现
个人使用了goagent的谷歌公司的代理,99%的都测不出来滴。
用php里面的函数可以实现
以上代码获得ip的方法,都没有错,错在你们的服务器可能是单线的。
本人亲自测试过,一样的php代码,使用美国服务器,获得真实长城宽带ip是错的,使用杭州的阿里粑粑多线服务器,获得则和ip138的一样,使用厦门电信的线路,获得的ip也是错的。可见多线在国内是挺重要的。国内就是他奶奶的操蛋,人为搞很多障碍。
