标题:获取客户端真实IP 出处:Felix021 时间:Tue, 27 Sep 2011 11:29:44 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?2039 内容: WEB开发有各种复杂性,典型的是HTTP的无状态连接,加密什么的,最近碰到的另一个头疼的事情就是如何获取客户端的真实IP。 其实以前在开发WOJ-Land的时候就遇到这个问题了:如果用户使用了HTTP代理来访问的话,通过REMOTE_ADDR只能获取到HTTP代理的IP,当时只是简单地再判断是否有X-FORWARDED-FOR这个HTTP头(对应PHP的$_SERVER['HTTP_X_FORWARDED_FOR'])来获取客户端的IP。虽然基本达到要求,但是还有各种问题。 一个比较常见的问题就是,如果用户通过多层HTTP代理来访问,那么每个代理都会把自己的IP加到X-FORWARDED-FOR这个头里面(用逗号隔开),真实的浏览器端IP应该是列表的第一个IP。 另外,有些CDN或者其他类似代理的服务,会提供其他的HTTP头,比如 Cdn_Src_Ip,Proxy-Client-IP,WL-Proxy-Client-IP, Client-IP等等。 一个比较合适的做法大概应该是这样:$arr_ip_header = array( "HTTP_CDN_SRC_IP", "HTTP_PROXY_CLIENT_IP", "HTTP_WL_PROXY_CLIENT_IP", "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR", "REMOTE_ADDR", ); $client_ip = ""; foreach ($arr_ip_header as $key) { if (!empty($_SERVER[$key]) && strtolower($_SERVER[$key]) != "unknown") { $client_ip = $_SERVER[$key]; break; } } if (false !== strpos($client_ip, ",")) { $client_ip = preg_replace("/,.*/", "", $client_ip); } p.s. 以上代码未经实际运行,可能存在语法问题。 Generated by Bo-blog 2.1.0