PHP的全局函数$_SERVER可以简单的获取到客户机的IP地址,但是存在代理或者ip伪装的时候,使用全局变量就会导致获取到的不是真是的Ip地址,要想获取到真实的ip,这是要话费一番功夫的
下面的函数,可以获取真实的IP地址
1 2 3 4 5 6 7 8 9 10 11 12 |
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); |
这一套代码在ThinkPHP 3.2.3中,有此函数.
函数:getenv()获取:Gets the value of an environment variable. 获取环境变量值.
函数:strcasecmp() :strcasecmp — Binary safe case-insensitive string comparison :比较字符串,不区分大小写.string1==string2 返回0 string1>string2 返回大于0的数,string1<string2 返回小于0的数
关于最后对于$_SERVER的判断,那是因为:$_SERVER是服务器超级全局变量数组,用$_SERVER['REMOTE_ADDR']同样可以获取到客户端的IP地址.二者的区别在于,getenv不支持IIS的isapi方式运行的php.
REMOTE_ADDR 是你的客户端跟你的服务器握手时候的ip,如果使用匿名代理,将显示代理服务器的的ip
HTTP_CLIENT_IP :是代理服务器i发送的HTTP头,如果是超级匿名代理,则返回none;REMOTE_ADD 也会被替换为这个代理服务器i的ip
相关阅读