HTTP请求头之 —— User-Agent(UA)

unimof 2021年03月08日 4,238次浏览

打开浏览器开发者工具,追踪一下浏览器的网络请求,我们会惊奇的发现,不管是图片、js脚本、html、css。。。,每个请求头里面,都会有一个字段,叫做User-Agent,就行下图类似
image.png

其实在早期的 HTTP 协议中,是没有这个 User-Agent 的,但是在 1992 年的 Http协议中,加入了一个User-Agent那为什么现在每个浏览器都支持 User-Agent?User-Agent 又有什么作用呢?为什么每个浏览器的 User-Agent 开头都是 Mozilla ?

1. 历史

  • 先驱 Mosaic
    NCSA Mosaic,或简称Mosaic。1993年,美国伊利诺大学的国家超级计算机应用中心(National Center for Supercomputing Applications,简称NCSA),是互联网历史上第一个获普遍使用和能够显示图片的网页浏览器,它自称 “NCSA_Mosaic/2.0(Windows 3.1)”。

image.png

  • 继任 Mozilla
    Mozilla = Mosaic + Killer,意为 Mosaic 杀手。在1994年,Mosaic开发团队的中心人物马克·安德森单飞出来,在美国加州设立了Mosaic Communication Corp(马赛克通信公司)。但 NCSA 明确警告 安德森 不能蹭 Mosaic 流量,安德森只好将公司名字改为 网景通信公司(Netscape Communications Corporation),并研发了 Netscape Navigator,也就是后来大名鼎鼎的 Firefox 的前身。
    由于更新得很快,当时占有率一飞冲天,成为了 浏览器领域事实上的老大。经历后续版本的用户积累,网景成为浏览器市场的霸主。
    而 Netscape Navigator 自称为 : Mozilla/1.0 (Win3.1),这就是 Mozilla 的由来。

由于 Mozilla 支持 frames 技术,而 Mosaic 不支持,所以当时的服务器端都是根据名字来决定到底应该发送带 frames 的页面,还是不带 frames 的页面。

  • 搅屎棍 IE
    Mozilla 的成功,自然让 Microsoft 眼红,并且当时 Netscape 认为微软 Windows 是 “poorly debugged device drivers” ,微软一怒之下决定研发自己的浏览器,也就是后来的 IE。当时 IE 也支持 frames 技术,当时 当时的服务器推给 IE 的页面都是不带 frames 的版本,因为,IE 不是 Mozilla。
    Microsoft 很不爽,他没有耐心等待所有的服务器升级支持 IE ,推送 frames 的版本。而是直接将 IE 伪装成 Mozilla。微软声称 IE 兼容 Mozilla —— “Mozilla compatible”,IE 自称为 Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)。
    Microsoft 为了推广IE,利用 Windows 的垄断地位,捆绑安装 IE,并最终干掉了 Mozilla 。

  • Gecko 引擎
    随着 IE 步步紧逼,Mozilla 不甘心走向没落,1997年,网景收购了DigitalStyle,开始研发下一代的排版引擎,并期望把新的排版引擎应用于下一版本的网景浏览器上。1998年初,Mozilla计划开始执行。这个新的排版引擎名为Raptor,以开发源码的方式发放于互联网上。后来,因为商标问题,Raptor改外为NGLayout(即next generation layout之意)。而最后NGLayout就被网景重新命名为Gecko。
    1998年10月,网景公布下一版的浏览器将会使用这个排版引擎,而该浏览器亦需要被大幅度重写。对于致力推动网上标准的人,这是一个令人振奋的消息。然而,对于网景开发者而言,这是一个长达六个月的大工程,而他们在网景5.0上(包括Mariner排版引擎)所花的心血亦被白白浪费。结果,网景6.0在2000年11月才被正式发布。
    2003年7月15日时代华纳解散了网景公司,大部分开发者被解雇。而Mozilla基金会亦在当天成立,继续推动着Gecko的发展。时至今天,Gecko仍继续由Mozilla的雇员和义工所维护和发展。
    Gecko的名称也改为了:Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826

  • Firefox
    Gecko太过优秀,越来越多的浏览器开始使用他作为内核,开发浏览器产品。Netscape 解散之后,Mozilla 基金会研发了 Firefox ,而 Firefox 名称在Gecko 基础上,改为了:Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0
    不只是 Firefox ,市场上出现了大量基于 Gecko 内核的浏览器,他们的名称也都是基于 Gecko 进行调整,所以他们的名称前缀都有 Mozilla。

  • Opera
    随着浏览器产品越来越多 ,Opera 浏览器开发了一个功能,可以让用户自己决定按照什么浏览器来进行展示。根据用户选择的不同,Opera的名称可以支持如下几种:
    -- Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51
    -- Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51
    -- Opera/9.51 (Windows NT 5.1; U; en)

  • Safari
    苹果也开发了属于自己的浏览器,Safari。不过Safari内核不是 Gecko,而是另一款内核 KHTML,并从 KHTML 切分出一个分支,取名 WebKit,WebKit 在KHTML基础上,增加了很多新的特性。
    Safari 自称为:Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5

  • Chrome
    Google 后来居上,研发了 Chrome 浏览器,并逐渐占据了市场主流份额,Chrome 内核和 Safari 一样,采用了 Webkit,所以 Chrome 的名称就在 Safari 上继续扩展:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27

2. 总结

User-Agent已经被滥用,并且还有一个致命的问题,就是浏览器现在都提供了模拟其他浏览器User-Agent的功能,这已经背离了User-Agent的初衷。
所以在实际开发过程中,最好不要通过User-Agent来进行业务逻辑判断。