Sep 27

获取客户端真实IP 不指定

felix021 @ 2011-9-27 11:29 [IT » 网络] 评论(0) , 引用(0) , 阅读(5465) | Via 本站原创 | |
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. 以上代码未经实际运行,可能存在语法问题。

转载请注明出自 ,如是转载文则注明原出处,谢谢:)
RSS订阅地址: http://www.felix021.com/blog/feed.php
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   *非必须
网址   电邮   [注册]