关于User Agent的历史,它是怎么变成今天这样的
界面设计

关于User Agent的历史,它是怎么变成今天这样的

早上继续每天的Js学习,看到了客户端检测(Client Detection)这一章,其中讲到了User Agent。
《Javascript高级程序设计》中,对User Agent的检测方法所持的态度是“有争议的”。书中推荐的是依据功能需要的语法能力识别(Capability detection),然后是浏览器习性识别(Quirks detection),两种都不行,再考虑User Agent方法。UserAgent最具争议的地方就是欺骗性(Spoofing),也就是通过发送的字符串来伪装成某个浏览器。
想起以前做我查查购物助手的时候,360安全浏览器就没法检测,因为它就一直把自己伪装成Chrome。听说是有一段时间各大互联网公司集体反360的后果。只是听说,不多说了。

书里面继续讲述了UserAgent的历史
————翻译开始————

关于HTTP 1.0和1.1的规范,浏览器在请求时应当发送一个字符串来指代其名字和版本。
第一个网页浏览器,1993年出自美国国家超级计算中心的Mosaic的User-agent是这样的:
Mosaic / 0.9
意义就是这是Mosaic浏览器,版本是0.9。
后来网景公司推出自己的浏览器,内部代号Mozilla,其实是Mosaic Killer的缩写(看到这我真笑了,有点像后来苹果研发Iphone时经常拿Palm开涮的感觉,许多测试文本都是“It’s not a Palm, damn”)。网景浏览器二代是第一个被大众广泛使用的浏览器,User-agent格式如下:

Mozilla / Version [Language] (Platform:Encryption)

网景浏览器保留了把产品名和版本号放在开头的传统,同时加上了下面的信息:
·Language:使用地区的语言
·Platform:使用的操作系统,或者浏览器是基于什么应用的
·Encryption:加密方式。包括U(128位加密)、I(40位加密)、N(不加密)
一个典型的网景2发出的User-agent是这样的:
Mozilla/2.02[fr](WinNT;I)
意为:网景2.02,法语国家使用,运行在WindowsNT,40位加密。
那个年代,通过User-agent来识别浏览器还挺方便的。

网景3与IE3

96年,网景3发布了,成为了当时最受欢迎的浏览器,风头盖过了Mosaic。User-agent只经历了点小变化,去掉了语言标识符,允许传递CPU的信息:

Mozilla/Version ( Platform;Encryption [;OS-or-CPU description])

紧接着魔头微软发布了IE3。但是由于当时的网景太火了,以至于很多服务器端都要先看看是不是网景然后再提供页面。这就导致了IE没法访问很多页面。于是微软不得不在发出的字符串中稍作修改,以与网景浏览器适配。这样就产生了这种User-agent格式:

Mozilla/2.0(compatible;MSIE Version; Operating System)

比方说,跑在Win95上的IE3.02的User-agent是这样的:
Mozilla/2.0(compatible; MSIE 3.02; Windows 95)
由于那时大多数的浏览器识别就是看看你User-agent的前半部分,所以IE成功地伪装成了网景浏览器。这种做法实际上违背了浏览器标识符的一些初衷,真正的浏览器版本号被掩埋在了字符串中间。

网景4以及IE4到IE8

97年的秋天,网景发布第四代浏览器,名字也从Navigator(导航者)变成了Communicator(沟通者)。User-agent则继续保持3代时的格式:

Mozilla/Version ( Platform; Encryption [; OS-orCPU description] )

这样,一个跑在Win98上的4代网景,user-agent是这样的:
Mozilla/4.79 (Win98;I)
同时期发布的IE4,User-agent长这样:
Mozilla/4.0 ( compatible; MSIE 4.0; Windows 98 )
这样,两者又在版本号上保持一致了,都是4.0。不过,同步也就到此为止。后来当IE4.5亮相在Mac上时,Mozilla的版本还是4,而IE的版本号变成了4.5:
Mozilla/4.0 ( compatible; MSIE 4.5; Mac_PowerPC )
到了IE7,形式还是差不多:
Mozilla/4.0 ( compatible; MSIE 7.0; Windows NT 5.1 )
直到IE8引入了一个新的标识符,叫Trident,表示渲染用的引擎,格式就变成了下面这样:
Mozilla/4.0 ( compatible; MSIE Version; Operating System; Trident/TridentVersion )
Trident标识符是用来帮助开发者决定IE8是否跑在兼容模式下的。通过这个标识符,就能判断一个浏览器是IE7还是兼容模式下的IE8。
IE9轻微地改了一下格式:Mozilla版本号被写到了5.0,然后Trident版本号也被写到了5.0。一个IE9的默认User-agent长这样:
Mozilla/5.0 ( compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0 )
当IE9跑在兼容模式的时候,旧的Mozilla版本号和MSIE版本号则被重写了。所以一个以IE7兼容模式运行的IE9,User-agent是这样的:
Mozilla/4.0 ( compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0 )
所有这些工作,就是为了能让老的user-agent识别脚本正确地工作。

Gecko

火狐的核心就是Gecko渲染引擎。最开始Gecko是作为Mozilla推网景六代的一部分被开发的。在网景六代中,有一个详细的规范指导着如何书写User-agent。格式是这样的:

Mozilla/MozillaVersion (Platform; Encryption; OS-or-CPU; Language;
PrereleaseVersion)Gecko/GeckoVersion
ApplicationProduct/ApplicationProductVersion

其中,标识符的含义如下:

这样,一个运行在WinXP的网景6.21的User-agent可能是长这样的:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4) Gecko/2011128 Netscape6/6.2.1
运行在WinXP的火狐是这样的:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11
运行在Mac上的Camino(我没听说过)是这样的:
Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.6) Gecko/20070809 Camino/1.5.1
很多时候,识别出具体是什么浏览器已经不重要了,重要的是看它是不是基于Gecko的。也是从那时候开始,Mozilla的版本号5.0就再也没有变过,估计以后也不会变了。
火狐4推出以后,Mozilla公司简化了User-agent字符串。主要改动包括:
·去掉环境语言标识,也就是Language
·当浏览器使用强加密的时候,加密标识符Encryption也不显示了。
·平台标识Platform去掉了,因为在OS-or-CPU中已经包含的操作系统的信息。
·GeckoVersion被写死成了:“Gecko/20100101”。
这样,一个最终版本的Firefox4的User-agent是这样的:
Mozilla/5.0 ( Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox 4.0.1

WebKit驾到

2003年的一天,苹果宣布将发布自己的网页浏览器,名叫Safari。渲染引擎则叫做WebKit。名字算是对KHTML的一个演变,这个KHTML曾被用做基于Linux的Konqueror渲染器的引擎。数年之后,Webkit分裂成了它自己的开源项目,专注于渲染引擎的开发。
针对这个新的浏览器和引擎做开发的人面对了当IE3同样的问题:你怎么知道那些著名的站点们能否识别你?解决方案则是把User-agent的信息扩充,好让那些站点相信这个浏览器跟主流的浏览器是兼容的。这导致了User-agent的如下写法:

Mozilla/5.0 (Platform; Encryption; OS-or-CPU; Language)
AppleWebKit/AppleWebKitVersion (KHTML, like Gecko) Safari/SafariVersion

举个例子:
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1
有趣的点在这:“KHTML, like Gecko”,苹果那段时间遭受了很多来自程序员的声讨,因为这条字符串就像在戏弄客户端以及服务端,把Safari当成Gecko。苹果的反应跟当初的微软也差不多:我们为了兼容嘛~
Safari 3 发布的时候还在“Safari”前面加上了一条“Version/3.0.3”,不过还是跟Gecko一样,识别重点在于是不是WebKit浏览器,而不是具体是什么浏览器。

Chrome

Google采用WebKit做渲染引擎,不过使用的是一个不同的Javascript引擎。Chrome的User-agent保留了所有从WebKit沿袭来的信息,同时加上了一小段给Chrome用的。格式如下:

Mozilla/5.0 (Platform; Encryption; OS-or-CPU; Language)
AppleWebKit/AppleWebKitVersion (KHTML, like Gecko)
Chrome/ChromeVersion Safari/SafariVersion

于是,一个Chrome7的User-agent写法如下:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7
(KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7

貌似Webkit版本号和Safari版本号要这么一直同步下去了。

iOS与安卓

iOS和安卓的默认浏览器都是基于Webkit的,因此具有同样的User-agent字符格式。iOS设备浏览器的格式如下:

Mozilla/5.0 (Platform; Encryption; OS-or-CPU like Mac OS X; Language)
AppleWebKit/AppleWebKitVersion (KHTML, like Gecko) Version/BrowserVersion Mobile/MobileVersion Safari/SafariVersion

注意哦,它增加了“like Mac OS X”来识别Mac系统,还增加了“Mobile”标识符。“Mobile”标识符被用来识别是移动版还是桌面版的Webkit内核。平台的识别则会以“iPhone”、“iPod”、“iPad”来表示。
比如:
Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us)
AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16

安卓浏览器的格式与iOS的相同,只是Mobile标识符后面没有版本号。
Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91)
AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

———— 翻译完 ————

邮箱地址不会被公开。 必填项已用*标注

文章归档