UA 之乱,始于微软

622 阅读6分钟

这是 64 位 win7 上,版本为 90.0.4430.72 的 Chrome 浏览器的 user-agent

Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36

可以看到,除了有 Chrome/90.0.4430.72 之外,还含有 Mozilla/5.0、 Safari/537.36、AppleWebKit/537.36 等字样,为什么一个 Chrome 浏览器,却要带上 Mozilla、Safari 等其他浏览器的标志?这一切要从浏览器诞生之初说起

Mosaic 浏览器

1993 年,在伊利诺伊大学的国家超级计算中心(NCSA),第一个支持图片的浏览器 Mosaic 诞生了!

此时的 UA 目的还很单纯,就是想告诉服务器,客户端的浏览器、操作系统的类型和版本

如下,是一个 Mosaic 浏览器的 UA
NCSA_Mosaic/2.0(Windows 3.1)

Mozilla/Netscape 浏览器

后来, Mosaic 的开发骨干 Marc Andreessen,离开了 NCSA, 前往硅谷创业, 开发了一个叫 Mozilla 的浏览器。

Mozilla 的名字来自 Mosaic killer 意思是要干掉 Mosaic ,为此伊利诺伊大学和 NCSA 非常不高兴, 于是 Mozilla 被改名为 Netscape,这就是当前大名鼎鼎的网景浏览器

Mozilla 浏览器虽然被迫改名为 Netscape,但是击败 Mosaic 的雄心没有改变,因此 Netscapeuser-agent 用的还是 Mozilla

如下,是一个 Netscape 浏览器的 UA
Mozilla/1.0(Windows 3.1)

到目前为止,UA 的内容还是很简洁、清爽的

User Agent 嗅探

不同于现在,在浏览器但是之处的早期阶段,不同的浏览器有着不同的特色功能,比如 Netscape 浏览器就支持 frames 技术,为了给用户提供更好的使用体验,服务端开发了 User Agent 嗅探功能,支持 frames 技术 Netscape 浏览器就返回带 frames 的页面,其他浏览器就返回另外的页面

而这一本来为提升用户体验,而根据不同的浏览器返回不同页面的技术,却为 UA 之乱埋下伏笔

Internet Explorer

Netscape 风靡网络,这让当年的软件霸主微软感受到了巨大的威胁, 微软推出了自己的浏览器 Internet Explorer,不仅免费,而且还捆绑在 windows 中作为默认浏览器,微软希望 Internet Explorer 成为 Netscape Killer

IE 的 UA 伪装

IE 诞生之初,就支持 framesNetscape 浏览器的先进技术,希望给用户提供良好的使用体验。

但当时很多网站的 User Agent 嗅探并没有适配 IE ,返回的还是不带 frames 等功能的页面。这也很正常,毕竟 IE 才刚刚诞生,想让大部分网站都适配,需要一定的时间。

微软可等不急了,为了尽快打到竞争对手,做出了一个日后引起 UA 之乱的决定,UA 伪装

虽然大部分网站的 User Agent 嗅探并没有适配 IE,但都适配了 Netscape 啊,既然这样,那我把 IE 的 User Agent 伪装成 NetscapeUser Agent 不就行了!

我不知道当年 Netscape 公司有没有去告微软不正当竞争,但这招 UA 伪装确实让 IE 大获成功,后面出现的浏览器也有样学样,都学微软搞起了 UA 伪装

如下,是一个 IE 浏览器的 UA
Mozilla/1.22(compatible; MSIE2.0 Windows 95)

Netscape 开源

IE 通过 UA 伪装 拿到了和 Netscape 一样的高级特性的页面,用户使用体验已经没有明显差距,在加上微软的随windows捆绑加免费的策略,打得 Netscape 节节败退

最终 Netscape 公司决定,将 Netscape 浏览器开源,就这样新的 Mozilla 诞生了,与此同时,它还拥有了一个叫做 Gecko 的渲染引擎

为了体现这个 Gecko 渲染引擎的强大,同时也方便网站服务端的适配,Mozilla 将他加入到了自己的 UA

例如
Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826

Gecko

Gecko 这个渲染引擎很厉害,很多浏览器开始使用它, 随着 Gecko 被广泛认可, 服务器又开始对 Gecko 进行 User Agent 嗅探了

Firefox

后来 Mozilla 变成了如今的 Firefox ,为了以示区分,Firefox 又在之前的 UA 基础上加上了 Firefox标识

例如
Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0

KHTML

Gecko 出现的同时期,Linux 平台出现了一个叫 KHTML 渲染引擎,并将它用在了同样是Linux 平台的 Konqueror 浏览器上。

Linux 平台觉得 KHTML 渲染引擎跟 Gecko一样出色,为什么它火我不火,与 Konqueror 浏览器将它的 UA 设置为
Mozilla/5.0 (compatible;Konqueror/3.2; FreeBSD)(KHTML, like Gecko)

KHTML, like Gecko 意思是跟 Gecko 一样优秀

Webkit 与 Safari

Apple 基于 KHTML,创建了新的渲染引擎 Webkit,将它用于自己的浏览器 Safari ,在设计 UA 时,Safari 保留了KHTML,like Gecko 标识,并添加新引擎 AppleWebKit 标识

Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85.7 (KHTML,like Gecko) Safari/85.5

Chrome

Google 基于 Safari 浏览器的 WebKit 引擎,开发了自己的 Chrome 浏览器,为此在设计 ChromeUA 时,很“厚道”的保留了 Safari UA 的所有内容,只加了一个 Chrome 标识

例如文章开头的

Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36

Edge

而微软最新推出的基于 ChromeChromium 内核的 Edge 浏览器"不忘初心",保留了 Chrome UA 的所有内容,并添加了一个 Edge 标识

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.54

就这样浏览器的 UA 越来越长,越来越复杂

Opera 的 UA 切换

虽然上面的 UA 越来越长,越来越复杂,但只要你愿意,好歹也可以通过特征标识把不同的浏览器区分开来,例如包含 Chrome 关键字的 UA 正常情况下肯定是 Chrome 浏览器

Opera 浏览器的一个举措让本就复杂的 UA 又增加了不确定因素。

Opera 浏览器觉得,UA 应该交由用户决定,并在 Opera 中增加了将自身 UA 切换成其他浏览器的 UA 的功能

到此,UA已经完全偏离了设计初衷——帮助服务器分辨用户的操作系统和浏览器的种类

当前 UA 现状

Opera 之后,很多浏览器都在一定程度上支持了 UA 切换功能,比如 Chrome 调试模式下切换到移动设备,就进行了 UA 切换,好在大部分主流浏览器对 UA 切换功能还是比较克制!但很多小众点的浏览器就不同了,将其作为核心卖点,这点在手机上有甚

不过现在,也很少会有网站会针对不同的浏览器去做不同的设配,更多是根据 UA 中操作系统(设备的类型既屏幕的大小) 去返回不同的页面

UA 混乱对相关从业人员的影响

影响是有的,注意是在辨别用户所在的平台不能单看 UA 了,需要结合其他手段综合辨别

尾巴

最后让我喊一句:微软罪大滔天!!!