是的,所有现代浏览器都假装自己是火狐

基本上 HTTP 客户端都会向服务器报告自己是什么,HTTP 标准(即 IETF RFC 7231)里面规定了这么一段:

A user agent SHOULD send a User-Agent field in each request unless specifically configured not to do so.

User-Agent = product *( RWS ( product / comment ) )

在我写这篇文章的时候,我用的浏览器 Mozilla Firefox 的“用户代理”字符串如下:

Mozilla/5.0 (X11; Linux x86_64; rv:124.0) Gecko/20100101 Firefox/124.0

按照标准来理解, Mozilla 是浏览器名称,5.0 是浏览器版本,后面全是注释,注释详细标注了 Gecko,也就是浏览器的引擎。看上去有点道理。但是,其实 Chrome 的用户代理也是 Mozilla 开头,比如:

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36

这可说来话长。

认识一下 NCSA Mosaic:一款已经归西的浏览器,也是最早广泛使用的浏览器之一,长下面这样:

当年,在其他浏览器还需要单独的界面来显示图片的时候,Mosaic 就学会了内联显示图片。这是一大进步。另外,NCSA 是(美国)国家超级电脑应用中心的缩写,除了浏览器,他们还开发了 NCSA Telnet 和 NCSA HTTPd,这个 HTTPd 是 Apache HTTPd 的前身。

Mosaic 还是很遵守标准的,他的 UA 长这样:

NCSA_Mosaic/2.7b6~flatpak4_(X11;Linux 6.6.24 x86_64) libwww/2.12 modified

不难看出,这里使用的是以现代 Ftatpak 格式重新编译打包的的 Mosaic。据说其 Windows 版的 UA 是这样:

NCSA_Mosaic/2.0 (Windows 3.1)

然后,Mosaic 的开发者创立了 Netscape 公司,开发 Netscape 浏览器,然后给了他们的项目一个代号,叫“Mozilla”,基本上就是把“Mosaic”和“Godzilla”粘在一起。(他们原来想延续 Mosaic 的名字,但是 NCSA 不让)。他的 UA 是:

Mozilla/1.0 (Win3.1)

然后 Netscape 开始变得和他的前辈 Mosaic 一样流行。可是 Netscape 与 Mosaic 功能并不一样,于是服务器软件和管理员开始利用 UA 来判断浏览器,并发送兼容的页面。所以,UA 以 Mozilla 开头的浏览器会获得更加高级的网页,因为 Netscape 支持高级特性,反之就是更加简单的网页。

目前没什么问题,但是后来一切开始乱套……

著名的行业搅屎棍微软打算插上一脚,他们开发了自己的浏览器,叫 Internet Explorer,并且功能和 Netscape 不相上下。但是,他们觉得没必要等服务器开发者和网络管理员熟悉自己,然后给自己发送高级网页。相反,他们选择假装自己是 Netscape,所以 UA 是这样:

Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)

微软很开心,用户也很开心。因为他们都有高级网页了。代价就是 UA 变丑。

微软打败了 Netscape,但是 Netscape 成立了 Mozilla 组织借尸还魂。他们开源了 Netscape,重写了不少代码。重写后的渲染引擎叫 Gecko,浏览器叫 Firefox。当时 Netscape 独立开发的浏览器版本号刚好走到 4.X,于是新的 Mozilla 浏览器套件的版本就变成了 5.0。所以火狐的 UA 长这样:

Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20101130 Firefox/4.0.1

这基本上就是 Firefox UA 的标准长相。不知道什么原因,他们决定在 UA 里面写上编译日期(坏!),也就是 Gecko/20101130,真正的 Gecko 版本在前面的 rv:2.0.1 里面。因为 Gecko 引擎不止 Firefox 一个应用,所以 Firefox/4.0.1 仅代表应用本身的版本。直到 Firefox 4 ,他们决定冻结 Gecko/yyyymmdd 为 Gecko/20100101,抛弃了在 UA 写编译日期的奇葩做法。

之后的故事几乎都是微软故事的翻版。不过幸好 IE 足够烂,没人假装自己是 IE。

KDE 开源爱好者开发了自己的浏览器和渲染引擎。KDE 就是 Kool 桌面环境的缩写,然后他们开发的许多东西起名都要与 K 相关。浏览器叫 Konqueror,渲染引擎叫 KHTML。 Gecko 很好,IE 不好。然后 KDE 觉得自己的 KHTML 与 Gecko 差不多一样好,支持也差不多,他们和微软一样选择假装自己。于是 UA 就变成了:

Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)

然后 Apple 看了 KHTML,决定拿过来开发自己的浏览器和引擎。浏览器叫 Safari,引擎叫 WebKit。他们继承了 KHTML 的全部要素,假装自己是 KHTML,加上了自己的部分,于是 UA 就这样了:

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

然后 Google 看了 Apple Webkit,决定拿过来开发自己的浏览器和引擎。浏览器叫 Chrome,引擎叫 Blink。他们继承了 Webkit 的全部要素,假装自己是 Safari,加上了自己的部分,于是 UA 就这样了:

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13

所以 UA 字符串就变成了这么大一块垃圾。目前现代的浏览器就三个流派,Blink(Chrome),Webkit(Safari),和 Gecko(Firefox)。所有人都在假装自己是别人。套壳浏览器比如现在的 Edge 和现在的 Opera 基本上就是 Chrome 改皮肤,然后 Chrome 假装自己是 Webkit 和 Safari,Webkit 假装自己是 Gecko。

只有火狐不用假装,因为无论是他的前身 Netscape 还是现在的 Gecko,都是被假装的那个。

发表回复

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