1、若是没有使用代理服务器,php
REMOTE_ADDR
= 客户端IP HTTP_X_FORWARDED_FOR
= 没数值或不显示nginx
$ip = $_SERVER['REMOTE_ADDR'];
2、使用透明代理,浏览器
REMOTE_ADDR
= 最后一个代理服务器 IP HTTP_X_FORWARDED_FOR
= 客户端真实 IP (通过多个代理服务器时,这个值相似:221.5.252.160, 203.98.182.163, 203.129.72.215)bash
这类代理还会将客户真实ip发送到请求对象,没法隐藏真实ip。服务器
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
3、使用普通匿名代理服务器,spa
REMOTE_ADDR
= 最后一个代理服务器 IP HTTP_X_FORWARDED_FOR
= 代理服务器 IP (通过多个代理服务器时,这个值相似:203.98.182.163, 203.98.182.163, 203.129.72.215)代理
这样就隐藏了客户端的真实ip,但服务器会知道客户端是经过代理服务器去访问的。code
4、使用欺骗性代理服务器,对象
REMOTE_ADDR
= 代理服务器 IP HTTP_X_FORWARDED_FOR
= 随机的 IP(通过多个代理服务器时,这个值相似:220.4.251.159, 203.98.182.163, 203.129.72.215)blog
服务器能够识别到时经过代理服务器访问的,但发送给目标服务器的是虚假ip。
5、使用高匿名代理,
REMOTE_ADDR
= 代理服务器 IP HTTP_X_FORWARDED_FOR
= 没数值或不显示
使用这种代理时,不一样浏览器不一样设备会返回不一样的ip头信息,所以PHP使用$_SERVER["REMOTE_ADDR"]
、$_SERVER["HTTP_X_FORWARDED_FOR"]
获取的值多是空值也多是“unknown
”值。
PHP获取ip代码以下:
public function ip() { //strcasecmp 比较两个字符,不区分大小写。返回0,>0,<0。 if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } $res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; echo $res; //dump(phpinfo());//全部PHP配置信息 }