User agent(下文简称 ua),也就是用户代理,指的是代表用户行为的程序(软件代理程序)。例如,网页浏览器就是一个“帮助用户获取、渲染网页内容并与之交互”的用户代理。
当用户代理通过网络协议进行操作时,它通常会向网络上的协作端(比如服务器端)提交一个特定的字符串来标识自己。这段字符串就是用户代理字符串(下文简称 ua 串)。当我们用浏览器访问 Web 应用的时候,浏览器会把自己的 ua 串加到 HTTP 请求的 User-Agent 头字段进行传输。
UA 串的发展史
1990 年,Tim Berners-Lee 编写了第一个浏览器 WorldWideWeb,后来改名为 Nexus。但是,Nexus 只支持文字展示。
1993 年,美国 NCSA 组织开发了 Mosaic 浏览器,能支持图片的展示使其成为第一款流行的浏览器。
这时候问题就来了,Nexus 不支持图片展示,而 Mosaic 是支持的。作为开发人员,该怎么编写页面代码呢?这时候 ua 串就可以发挥作用了,开发人员仅需针对 Mosaic ua 串的请求输出图片展示相关的代码即可。Mosaic 的 ua 串样本如下:
NCSA_Mosaic/1.0 (Windows 3.1)
其中 NCSA_Mosaic/1.0 为浏览器代号及其版本号,Windows 3.1 为操作系统及其版本号。
随后,1994 年,Mosaic 团队的领导者 Marc Andreessen 辞职并成立了自己的公司——Netscape,并开发了 Netscape Navigator 浏览器。它的内部代号为「Mozilla」,ua 串样本如下:
Mozilla/4.5 (compatible; HTTrack 3.0x; Windows 98)
Netscape Navigator 的市场占有率一度达到 90%,并且最先支持了框架(frame)特性。开发人员为了区别这两个浏览器,还是用的 ua 串识别这个方式。如果 ua 串中浏览器代号为 Mozilla,那就发送包含框架的页面,否则,就发送不含框架的页面。
再后来,1995 年,微软推出了 Internet Explorer(下文简称 IE)。IE 也支持框架,但因为过去的框架代码都是针对 Mozilla 这个代号发送的,这样一来,IE 即使支持框架,也收不到包含框架的代码。让所有的开发人员把自己的代码都改一遍明显不现实,最后 IE 只好“自称” Mozilla,同时在 ua 串的其他位置增加自己的代号 MSIE。它的 ua 串样本如下:
Mozilla/4.0 (compatible; MSIE 1.0; Windows 3.11)
IE 在浏览器市场中逐渐成为了霸主,败北的 Netscape Navigator 另起炉灶,开发了 Firefox。无论是 IE、Netscape Navigator 还是 Firefox,ua 串都以 Mozilla 代号开头。这也几乎成为了浏览器 ua 串事实上的格式标准:
Mozilla/[version] ([system and browser information]) [platform] ([platform details]) [extensions]
时至今日,ua 串承载的内容越来越多,开发人员识别起来的难度也越来越高了。