在开发网站时,为了统计访客数和访问量,经常需要统计网站访问者的 IP
地址。
1. 解决方法
获取客户端的 IP
地址有以下几种:
REMOTE_ADDR
:客户端跟服务器握手
时的IP
,如果使用了匿名代理
,则显示代理服务器的IP
。HTTP_CLIENT_IP
:代理服务器发送的Http
头,如果是超级匿名代理
,则返回none
值,同样,REMOTE_ADDR
也会被替换成这个代理服务器的IP
。HTTP_X_FORWARDED_FOR
:用户是在哪个IP
使用的代理。
2. 不同情况下的区别
2.1 没有使用代理服务器
REMOTE_ADDR
:客户端IP
HTTP_X_FORWARDED_FOR
:没数值或不显示
2.2 使用透明代理
REMOTE_ADDR
:最后一个代理服务器IP
HTTP_X_FORWARDED_FOR
:客户端真实IP
这类代理还会将客户真实 IP
发送到请求对象,无法隐藏真实 IP
。
2.3 使用普通匿名代理服务器
REMOTE_ADDR
:最后一个代理服务器IP
HTTP_X_FORWARDED_FOR
:代理服务器IP
这类代理隐藏了客户端的真实 IP
,但服务器会知道客户端是通过代理服务器去访问的。
2.4 使用欺骗性代理服务器
REMOTE_ADDR
:代理服务器IP
HTTP_X_FORWARDED_FOR
:随机的IP
服务器可以识别到时通过代理服务器访问的,但发送给目标服务器的是虚假 IP
。
2.5使用高匿名代理
REMOTE_ADDR
:代理服务器IP
HTTP_X_FORWARDED_FOR
:没数值或不显示
使用这种代理时,不同浏览器不同设备会返回不同的 IP
头信息,因此可能获得是 空值
或 unknown
值。
3. 示例代码
一般来讲,获取客户端 IP
,会先取 HTTP_CLIENT_IP
的值,其次拿 HTTP_X_FORWARDED_FOR
,最后是 REMOTE_ADDR
。
<?php
if(getenv('HTTP_CLIENT_IP')) {
$onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR')) {
$onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR')) {
$onlineip = getenv('REMOTE_ADDR');
} else {
$onlineip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
echo "你的IP地址:" . $onlineip;
?>
此处评论已关闭