User agent(下文简(jian)称 ua),也就是用户代(dai)理,指的是代(dai)表用户行为(wei)的程序(软件(jian)代理程(cheng)序)。例如,网页(ye)浏览器就是(shi)一个“帮助用(yong)户获取、渲染(ran)网(wang)页内容并与(yu)之交互”的用(yong)户代理。
当(dang)用户代理通过(guo)网络协议进(jin)行操作时,它(ta)通常会向网(wang)络上的协作(zuo)端(比如服务(wu)器端)提交一(yi)个特定的字符串来(lai)标识自己。这(zhe)段字符串就(jiu)是用户代理(li)字符串(下文(wen)简称 ua 串)。当我们(men)用浏览器访(fang)问 Web 应用的时候,浏览器会把自(zi)己的 ua 串加到 HTTP 请求(qiu)的 User-Agent 头字段进(jin)行传输。
UA 串的(de)发展史
1990 年,Tim Berners-Lee 编(bian)写了第一个(ge)浏览器 WorldWideWeb,后来(lai)改名为(wei) Nexus。但是,Nexus 只支持(chi)文字展示。
1993 年(nian),美国 NCSA 组织开(kai)发了 Mosaic 浏览器(qi),能支持图片(pian)的展示使其(qi)成为第一款流(liu)行的浏(liu)览器。
这时候(hou)问题就来了(le),Nexus 不支持图片(pian)展示,而 Mosaic 是支(zhi)持的。作(zuo)为开发人员,该怎(zen)么编写页面(mian)代码呢(ne)?这时候 ua 串就(jiu)可以发挥作(zuo)用了,开发人(ren)员仅需针对(dui) Mosaic ua 串的请求输(shu)出图片展示(shi)相关的代码(ma)即可。Mosaic 的 ua 串样本如下:
NCSA_Mosaic/1.0 (Windows 3.1)
其(qi)中 NCSA_Mosaic/1.0 为浏览器代号(hao)及其(qi)版本(ben)号,Windows 3.1 为操作系(xi)统及其版本(ben)号。
随后,1994 年,Mosaic 团(tuan)队的领导者(zhe) Marc Andreessen 辞职并成立了自己(ji)的公司——Netscape,并开(kai)发了 Netscape Navigator 浏览器(qi)。它的内部代(dai)号为「Mozilla」,ua 串(chuan)样本如下:
Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)
Netscape Navigator 的市场(chang)占有率一度(du)达到 90%,并且最先支持(chi)了框架(frame)特性(xing)。开(kai)发人员为了(le)区别这两个(ge)浏览器,还是(shi)用的 ua 串识别(bie)这个方式。如(ru)果 ua 串中浏览(lan)器代号(hao)为 Mozilla,那就发送(song)包含框架的(de)页面,否则,就(jiu)发送不含框(kuang)架的页面。
再(zai)后来,1995 年,微软(ruan)推出了 Internet Explorer(下文(wen)简称 IE)。IE 也(ye)支持框架,但(dan)因为过去的(de)框架代码都是(shi)针对 Mozilla 这个代号发(fa)送的(de),这样(yang)一来,IE 即使支(zhi)持框架,也收(shou)不到包(bao)含框架的代(dai)码。让所有的(de)开发人员把(ba)自己的代码(ma)都改一遍明(ming)显不现实,最(zui)后 IE 只好“自称(chen)” Mozilla,同时在(zai) ua 串的其他位(wei)置增加自己(ji)的代号 MSIE。它的 ua 串(chuan)样(yang)本如下(xia):
Mozilla/4.0 (compatible; MSIE 1.0; Windows 3.11)
IE 在浏览器市场(chang)中逐渐成为(wei)了霸主,败北(bei)的 Netscape Navigator 另起(qi)炉灶,开发了(le) Firefox。无论是 IE、Netscape Navigator 还是(shi) Firefox,ua 串都以 Mozilla 代号(hao)开头。这也几乎成(cheng)为了(le)浏览(lan)器 ua 串事实上(shang)的格式标准(zhun):
Mozilla/[version] ([system and browser information]) [platform] ([platform details]) [extensions]
时至今日,ua 串承载的(de)内容越来越(yue)多,开发人员(yuan)识别起来的(de)难度也越来(lai)越高了。