十年专注于品牌网站建设 十年专注于品牌网站建设,低调、高逼格、有情怀的网络应用服务商!
南昌百恒网络微信公众号 扫一扫关注
小程序
tel-icon全国服务热线:400-680-9298,0791-88117053
扫一扫关注百恒网络微信公众号
扫一扫打开百恒网络微信小程序

百恒网络

介绍Netscape Navigator、Internet Explorer、Gecko用户代理字符串的历史

BaiHeng 2013/6/19 3173
    用户代理检测通过检测用户代理字符串来确定实际使用的浏览器。在每一次HTTP请求过程中,用户代理字符串是作为响应首部发送的,而且该字符串可以通过JavaScript的navigator.userAgent属性访问。在服务器端,通过检测用户代理字符串来确定用户使用的浏览器是一种常用而且广为接受的做法。而在客户端,用户代理检测一般被当作一种万不得已才用的做法,其优先级排在能力检测和(或)怪癖检测之后。
    提到与用户代理字符串有关的争议,就不得不提到电子欺骗(spoofing)。所谓电子欺骗,就是指浏览器通过在自己的用户代理字符串加入一些错误或误导性信息,来达到欺骗服务器的目的。要弄清楚这个问题的来龙去脉,必须从Web问世初期用户代理字符串的发展讲起。
用户代理字符串的历史
    HTTP规范(包括1.0和1.1版)明确规定,浏览器应该发送简短的用户代理字符串,指明浏览器的名称和版本号。RFC 2616(即HTTP l.1协议规范)是这样描述用户代理字符串的:
“产品标识符常用于通信应用程序标识自身,由软件名和版本组成。使用产品标识符的大多数领域也允许列出作为应用程序主要部分的子产品,由空格分隔。按照惯例,产品要按照相应的重要程度依次列出,以便标识应用程序。”
上述规范进一步规定,用户代理字符串应该以一组产品的形式给出,字符串格式为:标识符/产品版本号。但是,现实中的用户代理字符串则绝没有如此简单。
1.早期的浏览器
    1993年,美国NCSA (National Center for Supercomputing Applications,国家超级计算机中心)发布了世界上第一款Web浏览器Mosaic。这款浏览器的用户代理字符串非常简单,类似如下所示:
Mosaic/0.9
    尽管这个字符串在不同操作系统和不同平台下会有所变化,但其基本格式还是简单明了的。正斜杠前面的文本表示产品名称(有时候会出现NCSA Mosaic或其他类似字样),而斜杠后面的文本是产品的版本号。
Netscape Communications公司介入浏览器开发领域后,遂将自己产品的代号定名为Mozilla(Mosaic Killer的简写,意即Mosaic杀手)。该公司第一个公开发行版,Netscape Navigator2的用户代理字符串具有如下格式:
Mozilla/版本号[语言](平台;加密类型)
Netscape在坚持将产品名和版本号作为用户代理字符串开头的基础上,又在后面依次添加了下列信息:
    口语言:即语言代码,表示应用程序针对哪种语言设计;
    口平台:即操作系统和(或)平台,表示应用程序的运行环境;
    口加密类型:即安全加密的类型。可能的值有U(128位加密)、I (40位加密)和N(未加密)。
典型的Netscape Navigator 2的用户代理字符串如下所示:
Mozilla/2. 02 [ fr] (WinNT; 工)
这个字符串表示浏览器是Netscape Navigator 2.02.为法语国家编译,运行在Windows NT平台下,加密类型为40位。那个时候,通过用户代理字符串中的产品名称,至少还能够轻易地确定用户使用的是什么浏览器。
2. Netscape Navigator 3和Internet Explorer 3
    1996年,Netscape Navigator 3发布,随即超越Mosaic成为当时最流行的Web浏览器。而用户代理字符串只作了一些小的改变,删除了语言标记,同时允许添加操作系统或系统使用的CPU等可选信息。于是,格式变成如下所示:
        Mozilla/版本号(平台;加密类型[j操作系统或CPU说明])
    运行在Windows系统下的Netscape Navigator 3的用户代理字符串大致如下:
        Mozilla/3.0 (Win95;U)
    这个字符串表示Netscape Navigator 3运行在Windows 95中,采用了128位加密技术。可见,在Windows系统中,字符串中的操作系统或CPU说明被省略了。
        Netscape Navigator 3发布后不久,微软也发布了其第一款赢得用户广泛认可的Web浏览器,即Internet Explorer 3。由于Netscape浏览器在当时占绝对市场份额,许多服务器在提供网页之前都要专门检测该浏览器。如果用户通过IE打不开相关网页,那么这个新生的浏览器很可能就会夭折。于是,微软决定将IE的用户代理字符串修改成兼容Netscape的形式,结果如下:
        Mozilla/2.0(compatible; MSIE版本号;操作系统)
例如,Windows 95平台下的Internet Explorer 3 .02带有如下用户代理字符串:
        Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)
    由于当时的大多数浏览器嗅探程序只检测用户代理字符串中的产品名称部分,结果IE就成功地将自己标识为Mozilla,从而伪装成Netscape Navigator。微软的这一做法招致了很多批评,因为它违反了浏览器标识的惯例。更不规范的是,IE将真正的浏览器版本号插入到了字符串的中间。
    字符串中另外一个有趣的地方是标识符Mozilla 2.0(而不是3.0)。毕竟,当时的主流版本是3.0,改成3.0应该对微软更有利才对。但真正的谜底到现在还没有揭开——但很可能只是人为疏忽所致。
3. Netscape Communicator 4和Internet Explorer 4-8
    1997年8月,Netscapte Communicator4发布(这一版将浏览器名字中的Navigator换成了Communicator)。Netscape继续遵循了第3版时的用户代理字符串格式:Mozilla/版本号(平台;加密类型[;操作系统或CPU说明])
    因此,Windows 98平台中第4版的用户代理字符串如下所示:
      Mozilla/4.O(Win98;工)
       Netscape在发布补丁时,子版本号也会相应提高,用户代理字符串如下面的4.79版所示:
       Mozilla/4. 79 (Win98;工)
    但是,微软在发布Internet Explorer4时,顺便将用户代理字符串修改成了如下格式:
       Mozilla/4.O(compatible; MSIE版本号j操作系统)
换句话说,对于Windows 98中运行的IE4而言,其用户代理字符串为:
    Mozilla/4.O(compatible; MSIE 4.O;Windows 98)
经过此番修改,Mozilla版本号就与实际的IE版本号一致了,为识别它们的第四代浏览器提供了方便。但令人遗憾的是,两者的一致性仅限于这一个版本。在Internet Explorer 4.5发布时(只针对Macs),虽然Mozilla版本号还是4,但IE版本号则改成了如下所示:
    Mozilla/4.O (compatible; MSIE 4.5;Mac_PowerPC; Trident/4.O)
    此后,lE的版本一直到7都沿袭了这个模式。而IE 8的用户代理字符串中添加了呈现引擎(Trident)
的版本号①:
    Mozilla/4.O(compatible; MSIE 8.0;Windows NT 5 .1; Trident/4.O)
至于IE的后续版本会不会修改Mozilla版本号,目前还无从知晓;南昌网页设计公司技术人员认为,改不改这个版本号,意义已经不大了(谁也不能指望通过它得到什么可靠的结论)。
4.Gecko
    Gecko是Firefox的呈现引擎。当初的Gecko是作为通用Mozilla浏览器的一部分开发的,而第一个采用Gecko引擎的浏览器是Netscape 6。为Netscape 6编写的一份规范中规定了未来版本中用户代理字符串的构成。这个新格式与4.x版本中相对简单的字符串相比,有着非常大的区别,如下所示:
    Mozilla/Mozilla版本号(平台;加密类型;操作系统或CPU;语言;预先发行版本)
    Gecko/Gecko版本号应用程序或产品/应用程序或产品版本号
这个明显复杂了很多的用户代理字符串中蕴含很多新想法。下表列出了字符串中各项的用意。
字符串项 必需吗 说 明
    Mozilla版本号 是 Mozilla的版本号平台 是 浏览器运行的平台。可能的值包括Windows. Mac和XII(指Unix的X窗口系统)
加密类型是加密技术的类型:U表示128位、I表示40位、N表示未加密操作系统或CPU 是 浏览器运行的操作系统或计算机系统使用的CPU。在Windows平台中,这一项指Windows的版本(如WinNT、Win95,等等)。如果平台是Macintosh.这一项指CPU(针对PowerPC的68K、PPC,或
Maclntel)。如果平台是Xll,这一项是Unix操作系统的名称,与使用Unix命令uname- sm得到的名称相同语言是浏览器设计时所针对的目标用户语言预先发行版本 否 最初用于表示Mozilla的预先发行版本,现在则用来表示Gecko呈现引擎的版本号Gecko版本号 是 Gecko呈现引擎的版本号,但由yyyymmdd格式的日期表示应用程序或产品 否 使用Gecko的产品名。可能是Netscape、Firefox,等等
应用程序或产品版本号 否 应用程序或产品的版本号;用于区分Mozilla版本号和Gecko版本号为了帮助读者更好地理解Gecko的用户代理字符串,下面我们来看几个从基于Gecko的浏览器中取得的字符串。
        Windows XP下的Netscape 6.21:
        Mozilla/5.O(Windows;U;Windows NT 5 .1; en-US; rv:0.9.4)Gecko/20011128 Netscape6/6.2.1
        Linux下的SeaMonkey l.la:
        Mozilla/5.0(X11;U;Linux i686; en-US; rv:1.8.1b2) Gecko/20060823 SeaMonkey/l. la
        Windows XP下的Firefox 2.0.0.11:
        Mozilla/5.0(Windows;U;Windows NT 5.1;en-US; nr:1.8.1.ll) Gecko/20071127 Firef ox/2.0.0.11
        Mac OSX下的Camin0 1.5.1:
        Mozilla/5.0(Macintosh;U;Intel Mac Os X;en; nr:1.8.1.6)Gecko/2 0070809 Camino/l.5.1
以上这些用户代理字符串都取自基于Gecko的浏览器(只是版本有所不同)。南昌网络公司技术员认为很多时候,检测特定的浏览器还不如搞清楚它是否基于Gecko更重要。每个字符串中的Mozilla版本都是5.O,自从第一个基于Gecko的浏览器发布时修改成这个样子,至今就没有改变过;而且,看起来以后似乎也不会有什么变化。
400-680-9298,0791-88117053
扫一扫关注百恒网络微信公众号
扫一扫打开百恒网络小程序

欢迎您的光顾,我们将竭诚为您服务×