从浏览器中检测确切的OS版本

时间:2009-03-15 15:19:52

标签: php javascript browser

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

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

11 个答案:

答案 0 :(得分:25)

简答:你不能。

答案很长:

您拥有的只是HTTP User-Agent标头中的信息,通常包含操作系统名称和版本。

通常,在Mac OS和Linux上运行的浏览器会发送足够的信息来识别确切的操作系统。例如,这是我的User-Agent标题:

  

Mozilla / 5.0(X11; U; Linux x86_64; en-US; rv:1.9.0.7)Gecko / 2009030423 Ubuntu / 8.10(强悍)Firefox / 3.0.7

你可以看到我正在运行Ubuntu 8.10 Intrepid Ibex。

这就是Firefox和Safari 4 Beta在我的MacBook Pro上报告的内容:

  

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

     

Mozilla / 5.0(Macintosh; U; Intel Mac OS X 10_5_6; zh-CN)AppleWebKit / 528.16(KHTML,类似Gecko)版本/ 4.0 Safari / 528.16

另一方面,Windows浏览器通常只报告操作系统版本而不报告特定包(专业版,商务版等):

  

Mozilla / 5.0(Windows; U; Windows NT 5.1; en-US; rv:x.x.x)Gecko / 20041107 Firefox / x.x

答案 1 :(得分:17)

经过一些谷歌搜索,我发现这个代码,它似乎工作正常,(虽然没有检测到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;
?>

答案 2 :(得分:14)

//这会帮助你

$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);

答案 3 :(得分:2)

在Classic ASP和ASP.NET中使用

Request.ServerVariables("HTTP_USER_AGENT")

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

答案 4 :(得分:1)

我认为您无法区分不同版本的Vista,但您应该能够从navigator对象的平台属性中获取操作系统。但是,你可能不得不解析它,或者根据它的内容进行区分。

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

请参阅www.w3schools.com教程,了解如何获取所有导航器属性的example

修改

要获得确切的版本,您可以开发ActiveX控件(仅限Windows)或Java Applet,并使用java.lang.System对象查看当前系统属性。您可以从浏览器获取足够的非Windows系统信息,并仅将控件用于Windows系统。我没试过这个,所以你需要试验一下它是否有用。我不得不相信Microsoft的Microsoft Update ActiveX控件能够检测确切的系统版本并安装软件才能工作。

答案 5 :(得分:1)

除非对Web应用程序的功能绝对必要,否则你应该尽量避免做类似的事情。

请注意:

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

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

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

用户代理标头中的内容可能会误导。

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

答案 6 :(得分:1)

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

这就是为什么例如jquery已经切换到浏览器功能系统(缺少更好的词)而不是浏览器嗅探系统的功能。

答案 7 :(得分:1)

我已经创建了一个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';
  }
}

答案 8 :(得分:1)

这可能是最简单的方法:

http://mobiledetect.net下载库

如果使用CI或仅包含它,请将Mobile_Detect.php放入“库”。

在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

的文档

答案 9 :(得分:0)

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

答案 10 :(得分:-2)

虽然这个问题很老但我只是回答它:

试试:

$this->agent->platform()

这会输出为:Linux, Windows, OS X, etc.

了解更多信息,请访问:

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