php获取用户(客户端)真实IP地址的三种方法
第一种方法,还算靠谱,本人以前一直用的是这个方法:
01 | function get_real_ip(){ |
02 | $ip =false; |
03 | if (! empty ( $_SERVER [ 'HTTP_CLIENT_IP' ])){ |
04 | $ip = $_SERVER [ 'HTTP_CLIENT_IP' ]; |
05 | } |
06 | if (! empty ( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ])){ |
07 | $ips = explode ( ', ' , $_SERVER [ 'HTTP_X_FORWARDED_FOR' ]); |
08 | if ( $ip ){ array_unshift ( $ips , $ip ); $ip =FALSE; } |
09 | for ( $i =0; $i < count ( $ips ); $i ++){ |
10 | if (! eregi ( '^(10│172.16│192.168).' , $ips [ $i ])){ |
11 | $ip = $ips [ $i ]; |
12 | break ; |
13 | } |
14 | } |
15 | } |
16 | return ( $ip ? $ip : $_SERVER [ 'REMOTE_ADDR' ]); |
17 | } |
第二种方法:
01 | function get_real_ip(){ |
02 | static $realip ; |
03 | if (isset( $_SERVER )){ |
04 | if (isset( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ])){ |
05 | $realip = $_SERVER [ 'HTTP_X_FORWARDED_FOR' ]; |
06 | } else if (isset( $_SERVER [ 'HTTP_CLIENT_IP' ])){ |
07 | $realip = $_SERVER [ 'HTTP_CLIENT_IP' ]; |
08 | } else { |
09 | $realip = $_SERVER [ 'REMOTE_ADDR' ]; |
10 | } |
11 | } else { |
12 | if ( getenv ( 'HTTP_X_FORWARDED_FOR' )){ |
13 | $realip = getenv ( 'HTTP_X_FORWARDED_FOR' ); |
14 | } else if ( getenv ( 'HTTP_CLIENT_IP' )){ |
15 | $realip = getenv ( 'HTTP_CLIENT_IP' ); |
16 | } else { |
17 | $realip = getenv ( 'REMOTE_ADDR' ); |
18 | } |
19 | } |
20 | return $realip ; |
21 | } |
第三种方法,摘自DISCUZ,应该还不错吧!
01 | // 获取IP地址(摘自discuz) |
02 | function getIp(){ |
03 | $ip = '未知IP' ; |
04 | if (! empty ( $_SERVER [ 'HTTP_CLIENT_IP' ])){ |
05 | return is_ip( $_SERVER [ 'HTTP_CLIENT_IP' ])? $_SERVER [ 'HTTP_CLIENT_IP' ]: $ip ; |
06 | } elseif (! empty ( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ])){ |
07 | return is_ip( $_SERVER [ 'HTTP_X_FORWARDED_FOR' ])? $_SERVER [ 'HTTP_X_FORWARDED_FOR' ]: $ip ; |
08 | } else { |
09 | return is_ip( $_SERVER [ 'REMOTE_ADDR' ])? $_SERVER [ 'REMOTE_ADDR' ]: $ip ; |
10 | } |
11 | } |
12 | function is_ip( $str ){ |
13 | $ip = explode ( '.' , $str ); |
14 | for ( $i =0; $i < count ( $ip ); $i ++){ |
15 | if ( $ip [ $i ]>255){ |
16 | return false; |
17 | } |
18 | } |
19 | return preg_match( '/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/' , $str ); |
20 | } |
转载请注明出处:
php程序员的笔记