使用PHP进行远程OS检测

时间:2010-09-30 13:38:15

标签: php

我在Mac上运行Apache / php服务器,我想根据访问它的操作系统显示不同的信息。

我怎么能用PHP做到这一点?

6 个答案:

答案 0 :(得分:4)

用户代理标头可能会显示一些操作系统信息,但我不会指望它。

对于您的用例,我将使用客户端的javascript进行ajax调用,以通知您的服务器客户端的操作系统。

这是一个例子。

Javascript(客户端,浏览器检测+ ajax调用): (注意:您需要detection script from here

window.addEvent('domready', function() { 
  if (BrowserDetect) { 
    var q_data = 'ajax=true&browser=' + BrowserDetect.browser + '&version=' + BrowserDetect.version + '&os=' + BrowserDetect.OS; 
    var query = 'record_browser.php' 
    var req = new Request.JSON({url: query, onComplete: setSelectWithJSON, data: q_data}).post(); 
  } 
}); 

PHP(服务器端):

if ($_SERVER['REQUEST_METHOD'] == 'POST') { 
    $session = session_id(); 
    $user_id = isset($user_id) ? $user_id ? 0; 
    $browser = isset($_POST['browser']) ? $_POST['browser'] ? ''; 
    $version = isset($_POST['version']) ? $_POST['version'] ? ''; 
    $os = isset($_POST['os']) ? $_POST['os'] ? ''; 

    // now do here whatever you like with this information
} 

答案 1 :(得分:2)

您可以查看用户代理标头($_SERVER['HTTP_USER_AGENT'])。例如,iPhone用户代理如下所示:

  

Mozilla / 5.0(iPhone; U; CPU iPhone OS   3_0 与Mac OS X一样; EN-US)   AppleWebKit / 420.1(KHTML,像Gecko一样)   版本/ 3.0 Mobile / 1A542a Safari / 419.3

Windows XP可能如下所示:

  

Mozilla / 5.0(Windows; U; Windows NT   5.1 ; EN-US; rv:1.9.2.10)Gecko / 20100914 Firefox / 3.6.10

等等。查看简单脚本here。您也可以使用get_browser()(您需要browscap

请注意,此标头很容易伪造,因此不应用于任何关键任务。

答案 2 :(得分:1)

可靠?你不能。

不可靠? $_SERVER['HTTP_USER_AGENT']通常包含操作系统信息。

答案 3 :(得分:1)

    function getBrowser()
    {
        $u_agent = $_SERVER['HTTP_USER_AGENT'];
        $bname = 'Unknown';
        $platform = 'Unknown';
        $version= "";

        //First get the platform?
        if (preg_match('/linux/i', $u_agent)) {
            $platform = 'linux';
        }
        elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
            $platform = 'mac';
        }
        elseif (preg_match('/windows|win32/i', $u_agent)) {
            $platform = 'windows';
        }

        // Next get the name of the useragent yes seperately and for good reason
        if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent))
        {
            $bname = 'Internet Explorer';
            $ub = "MSIE";
        }
        elseif(preg_match('/Firefox/i',$u_agent))
        {
            $bname = 'Mozilla Firefox';
            $ub = "Firefox";
        }
        elseif(preg_match('/Chrome/i',$u_agent))
        {
            $bname = 'Google Chrome';
            $ub = "Chrome";
        }
        elseif(preg_match('/Safari/i',$u_agent))
        {
            $bname = 'Apple Safari';
            $ub = "Safari";
        }
        elseif(preg_match('/Opera/i',$u_agent))
        {
            $bname = 'Opera';
            $ub = "Opera";
        }
        elseif(preg_match('/Netscape/i',$u_agent))
        {
            $bname = 'Netscape';
            $ub = "Netscape";
        }

        // finally get the correct version number
        $known = array('Version', $ub, 'other');
        $pattern = '#(?<browser>' . join('|', $known) .
        ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
        if (!preg_match_all($pattern, $u_agent, $matches)) {
            // we have no matching number just continue
        }

        // see how many we have
        $i = count($matches['browser']);
        if ($i != 1) {
            //we will have two since we are not using 'other' argument yet
            //see if version is before or after the name
            if (strripos($u_agent,"Version") < strripos($u_agent,$ub)){
                $version= $matches['version'][0];
            }
            else {
                $version= $matches['version'][1];
            }
        }
        else {
            $version= $matches['version'][0];
        }

        // check if we have a number
        if ($version==null || $version=="") {$version="?";}

        return array(
            'userAgent' => $u_agent,
            'name'      => $bname,
            'version'   => $version,
            'platform'  => $platform,
            'pattern'    => $pattern
        );
    }

var_dump(getBrowser());

查看详情enter link description here

答案 4 :(得分:0)

get_browser函数将为您解析$ _SERVER ['HTTP_USER_AGENT']。你需要browsecap.ini。

答案 5 :(得分:0)

我不会自己实现这一点,而是尝试使用现有的Browser.php软件来解析用户代理字符串。你需要考虑很多小事情,最好使用一个专门的库,而不是试着自己学习所有这些小平台/浏览器的不协调。