从浏览器检测确切的操作系统版本
Posted
技术标签:
【中文标题】从浏览器检测确切的操作系统版本【英文标题】:Detect exact OS version from browser 【发布时间】:2010-10-13 11:24:10 【问题描述】:我想知道是否有一种方法可以使用 php/JS/ASP 从我的浏览器中检测到确切的操作系统版本?
我知道我可以检测操作系统的类型(Windows XP、Windows Vista、OS X 等),但我需要检测确切的版本:Vista Business、Vista Ultimate、Windows XP Home、Windows XP Pro 等。 .
【问题讨论】:
【参考方案1】:简答:你不能。
长答案:
您所拥有的只是 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 (intrepid) 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; en-us) AppleWebKit/528.16 (Khtml, like Gecko) Version/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 Firefox/x.x
【讨论】:
也许可以通过 Flash 实现? @Roy:也许吧,但我不会打赌。 请注意,即使这样也不是万无一失的。例如,更改您的用户代理字符串以报告其他内容在 Firefox(下载插件)中是微不足道的,而在 IE(注册表更改)中几乎是微不足道的。 不需要万无一失的解决方案,但可以让我说 90% 的准确率。但事情似乎并非如此,这是不可行的。 甚至还有非浏览器程序(ftp、下载管理器)允许用户设置他们将标识自己的浏览器。【参考方案2】:经过一番谷歌搜索后,我找到了这段代码,它似乎工作正常,(虽然没有检测到 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;
?>
【讨论】:
不是他真正想做的事,不是吗? :) 这不会检测到 windows 的确切操作系统包(比如 xp home vista Ultimate ) 另外它不检测现在非常需要的移动操作系统 注意:eregi 已弃用! @ReedRichards 你能在你找到这个的地方发帖吗?【参考方案3】://这对你有帮助
$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】:在经典 ASP 和 ASP.NET 中使用
Request.ServerVariables("HTTP_USER_AGENT")
这是最好的,因为它不是解释代码,它是在服务器上运行的。
【讨论】:
有工作代码或建议检查什么属性总是好的【参考方案5】:你真的应该尽量避免这样做,除非它对于 Web 应用程序的功能是绝对必要的。
请注意:
并非所有请求都可以来自运行在 Windows 上的客户端。
并非所有请求都可以来自支持 javascript 的客户端。
请求中可能不存在用户代理标头。
用户代理标头中的内容可能具有误导性。
无论请求的用户代理标头中包含什么内容,或者客户端是否支持 javascript 或任何其他客户端扩展,一个设计良好的 Web 应用程序都应该提供完整的内容和功能。
【讨论】:
-1。不回答 OPs 的问题。而是主动提出意见。 这是关于问题的有用信息,但不回答问题本身 (+0)。我同意你的看法,但作为 S.O.有差异,有时需要检查:例如:windows/linux 使用 Ctrl 进行多选,mac 使用 bowen-knot,如果您想向用户正确解释,您可以:1)向两者解释, 2) 测试操作系统。【参考方案6】:我认为您无法区分不同版本的 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 控件能够检测到确切的系统版本并安装软件使其正常工作。
【讨论】:
正如你所说,这无助于区分子版本,但感谢 sn-p :-)【参考方案7】:正如其他人已经说过的那样,不,不可靠。
这就是为什么 jquery 已经切换到浏览器功能系统(因为没有更好的词)而不是浏览器嗅探系统的原因。
【讨论】:
您所说的浏览器功能或浏览器嗅探与浏览器相关,与 S.O 无关。例如,Firefox 24 在 Linux、Mac 或 Windows 上具有相同的功能。这个问题是关于 S.O.,而不是浏览器。【参考方案8】:我创建了一个执行此操作的 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】:这可能是最简单的方法:
从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 上查找文档
【讨论】:
【参考方案10】:在 CodeIgniter 中,您可以找到名为“user_agent”的库。它会给你真正需要的一切。如果你不使用 CI,你仍然可以为你的框架“提取”代码。希望有帮助。 http://codeigniter.com/user_guide/libraries/user_agent.html
【讨论】:
【参考方案11】:虽然这个问题很老了,但我只是回答它:
试试看:
$this->agent->platform()
这会给你输出:Linux, Windows, OS X, etc.
更多信息请访问:
http://ellislab.com/codeigniter/user-guide/libraries/user_agent.html
【讨论】:
以上是关于从浏览器检测确切的操作系统版本的主要内容,如果未能解决你的问题,请参考以下文章