get('header')); $server = array(); foreach ($headers as $header) { $ind = strpos($header, '='); if ($ind === false) continue; $server[strtoupper(substr($header, 0, $ind))] = substr($header, $ind + 1); } $ret['ip'] = self::simip($server); return succjson($ret); } public static function json_getip() { $ret['ip'] = getip(); return succjson($ret); } static function simip($server) { $headers = [ 'HTTP_CF_CONNECTING_IP', // Cloudflare 'HTTP_TRUE_CLIENT_IP', // Akamai/Cloudflare 'HTTP_X_FORWARDED_FOR', // 最常用的代理头 'HTTP_FORWARDED', // RFC 7239 标准 'HTTP_X_REAL_IP', // Nginx 'HTTP_FORWARDED_FOR', // 变体 'HTTP_X_FORWARDED', // 旧格式 ]; $ips = array(); foreach ($headers as $header) { if (!empty($server[$header])) //$_SERVER $ips[] = strtolower($server[$header]); } foreach ($ips as $ip) { $ind = strpos($ip, ','); if ($ind !== false) $ip = substr($ip, 0, $ind); $ind = strpos($ip, 'for='); if ($ind !== false) { //for=192.0.2.43:47011,for="[2001:db8:cafe::17]:47011",for=unknown //for=_hidden, for=_SEVKISEK $ip = substr($ip, $ind + 4); if ($ip[0] == '"') { $ip = substr($ip, 1, strpos($ip, '"', 1) - 1); $ind = strpos($ip, ']'); if ($ind !== false) $ip = substr($ip, 1, $ind - 1); } else if ($ip[0] == '[') { $ip = substr($ip, 1, strpos($ip, ']') - 1); } else { $ind = strpos($ip, ';'); if ($ind !== false) $ip = substr($ip, 0, $ind); if (strpos($ip, '.') !== false) { $ind = strpos($ip, ':'); if ($ind !== false) $ip = substr($ip, 0, $ind); } } } else { if (strpos($ip, '.') !== false) { $ind = strpos($ip, ':'); if ($ind !== false) $ip = substr($ip, 0, $ind); } } if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) return $ip; } if (isset($_SERVER['REMOTE_ADDR'])) return $_SERVER['REMOTE_ADDR']; return '0.0.0.0'; } }