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

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

我知道我可以检测到操作系统的types(Windows XP,Windows Vista,OS X等),但我需要检测确切的版本:Vista商业版,Vista旗舰版,Windows XP家庭版,Windows XP专业版等…

简短的回答:你不能。

很长的回答:

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

通常,在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

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

以下是我的MacBook Pro上Firefox和Safari 4 Beta的报告:

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:xxx)Gecko / 20041107 Firefox / xx

一些谷歌search后,我发现这个代码,它似乎工作正常,(虽然不检测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; ?> 

//这会帮助你

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

在传统的ASP和ASP.NET使用

 Request.ServerVariables("HTTP_USER_AGENT") 

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

你应该尽量避免做这样的事情,除非它对于Web应用程序的function是绝对必要的。

请注意:

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

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

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

用户代理标题中的内容可能会导致误解。

精心devise的Web应用程序应提供完整的内容和function,而不pipe请求的用户代理标题中是什么,或者客户端是否支持JavaScript或任何其他客户端扩展。

我不认为你可以区分不同版本的Vista,但你应该能够从导航器对象的平台属性中获得操作系统。 但是,您可能需要parsing它,或者根据其内容进行区分。

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

有关如何获取所有导航器属性的示例,请参阅www.w3schools.com教程。

编辑

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

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

这就是为什么例如jQuery已经切换到浏览器function系统 (缺乏一个更好的词),而不是浏览器嗅探系统的function。

我已经创build了一个jquery函数。 这样我们可以使用导航器来跟踪所有的操作系​​统。

希望有人能从这里得到帮助:

 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'; } } 

这可能是最简单的方法:

http://mobiledetect.net下载库;

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

在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上查找文档;

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

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

你试一试:

$this->agent->platform()

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

更多信息请访问:

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