HTTP_CLIENT_IP
代表的是代理服务器发送的HTTP
头,如果是超级匿名代理
,则返回none
值,该值若存在,REMOTE_ADDR
也将会替换为这个代理服务器的ip
。
HTTP_X_FORWARDED_FOR
代表的是用户在哪个ip
使用的代理,其有可能存在,也有可能伪造
。
REMOTE_ADDR
代表的是最后客户端和服务器握手时候的ip
,若此时使用了匿名代理
,REMOTE_ADDR
将显示为代理代理服务器的ip
。
优先级
程序通常处理的优先级
HTTP_CLIENT_IP
> HTTP_X_FORWARDED_FOR
> REMOTE_ADDR
其中HTTP_CLIENT_IP
未成标准 HTTP_X_FORWARDED_FOR
成为标准 格式为 clientip,proxy1,proxy2
,这两种获取方式均不可靠。
REMOTE_ADDR
是可靠的,它是最后一个跟你的服务器握手的ip
,可能是用户的代理服务器,也可能是自己的反向代理。
最后附上PHP通常获取clientIp
的demo
function get_client_ip(){
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);
}