PHP脚本获取客户端IP地址和解析设备信息
在互联网应用中,了解访问者的信息对于网站分析、用户行为跟踪以及安全控制等方面非常重要。PHP是一种广泛使用的服务器端脚本语言,它提供了多种方法来收集和处理来自客户端的数据。下面的代码片段展示了两个PHP函数,它们分别用于获取客户端的IP地址和解析用户的设备信息(包括操作系统和浏览器)。
获取客户端IP地址
function get_client_ip() { $ipaddress = ''; if (getenv('HTTP_CLIENT_IP')) { $ipaddress = getenv('HTTP_CLIENT_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR')) { $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); } elseif (getenv('HTTP_X_FORWARDED')) { $ipaddress = getenv('HTTP_X_FORWARDED'); } elseif (getenv('HTTP_FORWARDED_FOR')) { $ipaddress = getenv('HTTP_FORWARDED_FOR'); } elseif (getenv('HTTP_FORWARDED')) { $ipaddress = getenv('HTTP_FORWARDED'); } elseif (getenv('REMOTE_ADDR')) { $ipaddress = getenv('REMOTE_ADDR'); } else { $ipaddress = 'UNKNOWN'; } return $ipaddress; }
这个get_client_ip()
函数尝试从多个环境变量中查找客户端的IP地址。这些变量通常由Web服务器或代理服务器设置,以反映请求的实际来源。函数按照一定的优先级顺序检查各个可能包含客户端IP地址的环境变量,并返回找到的第一个非空值。如果所有这些变量都为空,则返回字符串'UNKNOWN'表示无法确定客户端的IP地址。
HTTP_CLIENT_IP
: 一般由负载均衡器或代理服务器设置,直接反映了原始客户端的IP。HTTP_X_FORWARDED_FOR
: 是一个标准的HTTP头字段,用来识别通过HTTP代理或负载平衡器连接到Web服务器的客户端的原始IP地址。HTTP_X_FORWARDED
,HTTP_FORWARDED_FOR
,HTTP_FORWARDED
: 这些都是变体形式,某些代理可能会使用不同的命名约定。REMOTE_ADDR
: 是最直接的方式,当没有代理时,它代表了直接与服务器通信的客户端的IP地址。
解析设备信息
function parse_device_info($userAgent) { $platform = '(unknown)'; $browser = '(unknown)'; // 获取操作系统 // [此处省略了大量正则表达式匹配代码] // 获取浏览器 // [此处省略了大量正则表达式匹配代码] return "平台: {$platform}, 浏览器: {$browser}"; }
parse_device_info($userAgent)
函数接收一个参数 $userAgent
,这是HTTP请求头中的User-Agent字符串,包含了关于发起请求的客户端软件的信息。通过一系列的正则表达式匹配,该函数尝试识别出客户端的操作系统和浏览器类型,并将结果格式化为“平台: [操作系统], 浏览器: [浏览器]”的形式返回。
操作系统的检测是基于一系列针对特定操作系统特征字符串的正则表达式进行的。例如,
/windows nt 10/i
匹配Windows 10操作系统。类似地,浏览器的检测也是通过正则表达式完成的,如
/msie/i
用于识别Internet Explorer浏览器。
需要注意的是,虽然这段代码可以有效地解析大部分常见的User-Agent字符串,但它并不能保证100%的准确性。因为User-Agent字符串是可以被客户端自定义的,而且新的浏览器版本或操作系统可能会引入不在此代码覆盖范围内的新字符串模式。因此,在实际应用中,建议定期更新这些正则表达式,或者考虑使用更专业的库,比如Mobile_Detect
或其他第三方服务,来提高解析的准确性和可靠性。
效果图如下
完整代码如下
// 获取客户端IP地址 function get_client_ip() { $ipaddress = ''; if (getenv('HTTP_CLIENT_IP')) { $ipaddress = getenv('HTTP_CLIENT_IP'); } elseif (getenv('HTTP_X_FORWARDED_FOR')) { $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); } elseif (getenv('HTTP_X_FORWARDED')) { $ipaddress = getenv('HTTP_X_FORWARDED'); } elseif (getenv('HTTP_FORWARDED_FOR')) { $ipaddress = getenv('HTTP_FORWARDED_FOR'); } elseif (getenv('HTTP_FORWARDED')) { $ipaddress = getenv('HTTP_FORWARDED'); } elseif (getenv('REMOTE_ADDR')) { $ipaddress = getenv('REMOTE_ADDR'); } else { $ipaddress = 'UNKNOWN'; } return $ipaddress; } // 解析设备信息的函数 function parse_device_info($userAgent) { $platform = '(unknown)'; $browser = '(unknown)'; // 获取操作系统 if (preg_match('/linux/i', $userAgent)) { $platform = 'Linux'; } elseif (preg_match('/macintosh|mac os x/i', $userAgent)) { $platform = 'Mac'; } elseif (preg_match('/windows nt 10/i', $userAgent)) { $platform = 'Windows 10'; } elseif (preg_match('/windows nt 6.3/i', $userAgent)) { $platform = 'Windows 8.1'; } elseif (preg_match('/windows nt 6.2/i', $userAgent)) { $platform = 'Windows 8'; } elseif (preg_match('/windows nt 6.1/i', $userAgent)) { $platform = 'Windows 7'; } elseif (preg_match('/windows nt 6.0/i', $userAgent)) { $platform = 'Windows Vista'; } elseif (preg_match('/windows nt 5.2/i', $userAgent)) { $platform = 'Windows Server 2003/XP x64'; } elseif (preg_match('/windows nt 5.1/i', $userAgent)) { $platform = 'Windows XP'; } elseif (preg_match('/windows xp/i', $userAgent)) { $platform = 'Windows XP'; } elseif (preg_match('/windows nt 5.0/i', $userAgent)) { $platform = 'Windows 2000'; } elseif (preg_match('/windows me/i', $userAgent)) { $platform = 'Windows ME'; } elseif (preg_match('/win98/i', $userAgent)) { $platform = 'Windows 98'; } elseif (preg_match('/win95/i', $userAgent)) { $platform = 'Windows 95'; } elseif (preg_match('/win16/i', $userAgent)) { $platform = 'Windows 3.11'; } // 获取浏览器 if (preg_match('/msie/i', $userAgent) && !preg_match('/opera/i', $userAgent)) { $browser = 'Internet Explorer'; } elseif (preg_match('/firefox/i', $userAgent)) { $browser = 'Firefox'; } elseif (preg_match('/safari/i', $userAgent)) { $browser = 'Safari'; } elseif (preg_match('/chrome/i', $userAgent)) { $browser = 'Chrome'; } elseif (preg_match('/edge/i', $userAgent)) { $browser = 'Edge'; } elseif (preg_match('/opera/i', $userAgent)) { $browser = 'Opera'; } elseif (preg_match('/netscape/i', $userAgent)) { $browser = 'Netscape'; } return "平台: {$platform}, 浏览器: {$browser}"; }