代码之家  ›  专栏  ›  技术社区  ›  Roy Peleg

从浏览器检测确切的操作系统版本

  •  18
  • Roy Peleg  · 技术社区  · 17 年前

    我想知道是否有一种方法可以使用php/js/asp从我的浏览器中检测到确切的操作系统版本?

    我知道我可以检测操作系统的类型(Windows XP、Windows Vista、OS X等),但我需要检测确切的版本:Vista Business、Vista Ultimate、Windows XP Home、Windows XP Pro等…

    11 回复  |  直到 9 年前
        1
  •  25
  •   Can Berk Güder Pugalmuni    17 年前

    简短回答: 你不能。

    长回答:

    您所拥有的只是HTTP用户代理头中的信息,它通常包含操作系统名称和版本。

    通常,运行在Mac OS和Linux上的浏览器会发送足够的信息来识别确切的操作系统。例如,下面是我的用户代理头:

    mozilla/5.0(x11;u;linux x86_64;en-us;rv:1.9.0.7)gecko/2009030423 ubuntu/8.10(intrepid)firefox/3.0.7

    你可以看到我在运行Ubuntu8.10无畏的ibex。

    以下是我的MacBook Pro上的Firefox和Safari 4测试版报告:

    Mozilla/5.0(Macintosh;U;Intel Mac OS X 10.5;en-US;RV:1.9.0.7)Gecko/2009021906火狐/3.0.7

    Mozilla/5.0(Macintosh;U;Intel Mac OS X 10_5_6;en-US)AppleWebkit/528.16(khtml,类似gecko)版本/4.0 Safari/528.16

    另一方面,Windows浏览器通常只报告操作系统版本,而不报告特定的软件包(pro、business等):

    Mozilla/5.0(windows;u;windows nt 5.1;en-us;rv:x.x.x)Gecko/20041107火狐/x.x

        2
  •  17
  •   shybovycha    13 年前

    在谷歌搜索之后,我发现了这段代码,它似乎工作正常(但没有检测到Unix)。

    <?php 
    $OSList = array
    (
    // Match user agent string with operating systems
    'Windows 3.11' => 'Win16',
    'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)',
    'Windows 98' => '(Windows 98)|(Win98)',
    'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)',
    'Windows XP' => '(Windows NT 5.1)|(Windows XP)',
    'Windows Server 2003' => '(Windows NT 5.2)',
    'Windows Vista' => '(Windows NT 6.0)',
    'Windows 7' => '(Windows NT 7.0)',
    'Windows NT 4.0' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)',
    'Windows ME' => 'Windows ME',
    'Open BSD' => 'OpenBSD',
    'Sun OS' => 'SunOS',
    'Linux' => '(Linux)|(X11)',
    'Mac OS' => '(Mac_PowerPC)|(Macintosh)',
    'QNX' => 'QNX',
    'BeOS' => 'BeOS',
    'OS/2' => 'OS/2',
    'Search Bot'=>'(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves/Teoma)|(ia_archiver)'
    );
    // Loop through the array of user agents and matching operating systems
    foreach($OSList as $CurrOS=>$Match)
    {
    // Find a match
    if (eregi($Match, $_SERVER['HTTP_USER_AGENT']))
    {
    // We found the correct match
    break;
    }
    }
    // You are using ...
    echo "You are using ".$CurrOS;
    ?>
    
        3
  •  14
  •   codingtiger Sanjay    9 年前

    //这将帮助您

    $uagent = $_SERVER['HTTP_USER_AGENT'] . "<br/>";
    
    function os_info($uagent)
    {
        // the order of this array is important
        global $uagent;
        $oses   = array(
            'Win311' => 'Win16',
            'Win95' => '(Windows 95)|(Win95)|(Windows_95)',
            'WinME' => '(Windows 98)|(Win 9x 4.90)|(Windows ME)',
            'Win98' => '(Windows 98)|(Win98)',
            'Win2000' => '(Windows NT 5.0)|(Windows 2000)',
            'WinXP' => '(Windows NT 5.1)|(Windows XP)',
            'WinServer2003' => '(Windows NT 5.2)',
            'WinVista' => '(Windows NT 6.0)',
            'Windows 7' => '(Windows NT 6.1)',
            'Windows 8' => '(Windows NT 6.2)',
            'Windows 8.1' => '(Windows NT 6.3)',
            'Windows 10' => '(Windows NT 10.0)',
            'WinNT' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)',
            'OpenBSD' => 'OpenBSD',
            'SunOS' => 'SunOS',
            'Ubuntu' => 'Ubuntu',
            'Android' => 'Android',
            'Linux' => '(Linux)|(X11)',
            'iPhone' => 'iPhone',
            'iPad' => 'iPad',
            'MacOS' => '(Mac_PowerPC)|(Macintosh)',
            'QNX' => 'QNX',
            'BeOS' => 'BeOS',
            'OS2' => 'OS/2',
            'SearchBot' => '(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves/Teoma)|(ia_archiver)'
        );
        $uagent = strtolower($uagent ? $uagent : $_SERVER['HTTP_USER_AGENT']);
        foreach ($oses as $os => $pattern)
            if (preg_match('/' . $pattern . '/i', $uagent))
                return $os;
        return 'Unknown';
    }
    echo os_info($uagent);
    
        4
  •  2
  •   Danny G    14 年前

    在经典的ASP和ASP.NET中使用

    Request.ServerVariables("HTTP_USER_AGENT")
    

    这是最好的方法,因为它不是解释代码,而是在服务器上运行。

        5
  •  1
  •   Vasil    17 年前

    除非对Web应用程序的功能绝对必要,否则您应该尽量避免这样做。

    请注意:

    并非所有请求都可以来自运行在Windows上的客户端。

    并非所有请求都可以来自支持JavaScript的客户机。

    请求中可能不存在用户代理头。

    用户代理头中的内容可能有误。

    一个设计良好的Web应用程序应该提供完整的内容和功能,不管请求的用户代理头中是什么,或者客户机是否支持JavaScript或任何其他客户端扩展。

        6
  •  1
  •   tvanfosson    17 年前

    我不认为你能区分不同版本的Vista,但是你应该能从 navigator 对象的平台属性。不过,您可能需要解析它,或者根据它的内容进行区分。

    <script type="text/javascript">
       alert( navigator.platform );
    </script>
    

    www.w3schools.com 的教程 example 显示如何获取导航器的所有属性。

    编辑 :

    为了获得精确的版本,您可以开发ActiveX控件(仅Windows)或Java Applet,并使用JavaLang.Stand对象查看当前系统属性。对于非Windows系统,您可能能够从浏览器中获得足够的信息,并且只能对Windows系统使用该控件。我还没试过,所以你得做个实验看看它是否有效。我必须相信,微软的ActiveX控件可以检测到确切的系统版本和安装的软件,使其工作。

        7
  •  1
  •   jeroen    17 年前

    正如其他人已经说过的,不,不可靠。

    这就是jquery切换到浏览器功能的原因 系统 (因为没有更好的词)而不是浏览器嗅探系统的功能。

        8
  •  1
  •   vyasamit2007    13 年前

    我已经创建了一个jquery函数来完成这个任务。这样我们就可以使用 navigator .

    希望有人能从中得到帮助:

    function find_os_version() {
      var ua = navigator.userAgent.toLowerCase();
      if (ua.indexOf("windows nt 5.0") != -1) {
        return 'win2k';
      }
      if (ua.indexOf("windows nt 5.1") != -1) {
        return 'winXP';
      }
      if (ua.indexOf("windows nt 6.0") != -1) {
        return 'winVista';
      }
      if (ua.indexOf("windows nt 6.1") != -1) {
        return 'win7';
      }
      if (ua.indexOf("windows nt 6.2") != -1) {
        return 'win8';
      }
    }
    
        9
  •  1
  •   Ganesh Bhosale    12 年前

    这可能是最简单的方法:

    从下载库 http://mobiledetect.net

    如果使用CI或只包含它,请将mobile_detect.php放入“libraries”。

    在PHP中使用此代码

    $detect = new Mobile_Detect();
    // Get the version() of components.
    $detect->version('iPad'); // 4.3 (float)
    $detect->version('iPhone') // 3.1 (float)
    $detect->version('Android'); // 2.1 (float)
    $detect->version('Opera Mini'); // 5.0 (float)
    

    查找文档 http://dwij.co.in/mobile-os-detection-in-php-codeigniter

        10
  •  0
  •   lokers    14 年前

    在CodeIgniter中,您可以找到名为“用户\u代理”的库。它会给你真正需要的一切。如果不使用CI,您仍然可以“提取”框架的代码。希望有帮助。 http://codeigniter.com/user_guide/libraries/user_agent.html

        11
  •  -2
  •   Mohammed Sufian    12 年前

    虽然这个问题很古老,但我只是在回答:

    试一试:

    $this->agent->platform()

    这将为您提供以下输出: Linux, Windows, OS X, etc.

    有关详细信息,请访问:

    http://ellislab.com/codeigniter/user-guide/libraries/user_agent.html