TP6中无法获取到用户真实的IP,无法穿透代理,以下分享一个自用的获取IP的代码,估计TP5中存在同样的问题。
1** 2 * 获得用户的真实IP地址 3 * 4 * @access public 5 * @return string 6 */ 7function real_ip() 8{ 9 static $realip = NULL; 10 11 if ($realip !== NULL) 12 { 13 return $realip; 14 } 15 16 if (isset($_SERVER)) 17 { 18 if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 19 { 20 $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']); 21 22 /* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */ 23 foreach ($arr AS $ip) 24 { 25 $ip = trim($ip); 26 27 if ($ip != 'unknown') 28 { 29 $realip = $ip; 30 31 break; 32 } 33 } 34 } 35 elseif (isset($_SERVER['HTTP_CLIENT_IP'])) 36 { 37 $realip = $_SERVER['HTTP_CLIENT_IP']; 38 } 39 else 40 { 41 if (isset($_SERVER['REMOTE_ADDR'])) 42 { 43 $realip = $_SERVER['REMOTE_ADDR']; 44 } 45 else 46 { 47 $realip = '0.0.0.0'; 48 } 49 } 50 } 51 else 52 { 53 if (getenv('HTTP_X_FORWARDED_FOR')) 54 { 55 $realip = getenv('HTTP_X_FORWARDED_FOR'); 56 } 57 elseif (getenv('HTTP_CLIENT_IP')) 58 { 59 $realip = getenv('HTTP_CLIENT_IP'); 60 } 61 else 62 { 63 $realip = getenv('REMOTE_ADDR'); 64 } 65 } 66 67 preg_match("/[\d\.]{7,15}/", $realip, $onlineip); 68 $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0'; 69 70 return $realip; 71}