Home > Backend Development > PHP Tutorial > php如何获取真实IP

php如何获取真实IP

WBOY
Release: 2016-06-23 14:11:46
Original
984 people have browsed it

试了网上很多代码都不行,但是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();
Copy after login


回复讨论(解决方案)

没研究过,我也想了解下。
期待楼下给出答案

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;	}
Copy after login

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也是错的。可见多线在国内是挺重要的。国内就是他奶奶的操蛋,人为搞很多障碍。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template