[譯]User-agent 字串史

轉載自:原貼地址

英文原貼:History of the user-agent string

作者:Nicholas C. Zakas

在《特性檢測並非瀏覽器檢測》貼文中談到了 User-agent 嗅探,有回貼支持本人繼續談下去。那本人認爲:User-agent 嗅探是必備的一項重要的技術。要知道 user-agent 字串檢測不太精準的原因,必須談這些年來 user-agent 字串發生了怎樣的變化。

原作者的廣告時間:本貼文是從《JavaScript 高級程序設計(第2版)》中內容刪減而來,完整的內容請看本書。

較古的瀏覽器

1993年,NCSA 發佈了首款 web 瀏覽器 Mosaic。它的 user-agent 字串非常簡潔:
Mosaic/0.9

雖然當時由於它對操作系統和平臺的依賴性,但是基本格式還是很簡單明瞭。在文本中,斜槓前面是產品名稱(可能會顯示爲 NCSA Mosaic 或是其他類似的字),斜槓後面是產品版本號。

Netscape Communications 開發了 web 瀏覽器 Mozilla(當時號稱“Mosaic 殺手”)。他們首款公開發行版本: Netscape Navigator 2 的user-agent 字串具有如下格式:
Mozilla/Version [Language] (Platform; Encryption)

Netscape 按之前的做法在 user-agent 字串的前半部分使用了產品名稱和產品版本,但在後面增加了下列信息:

Language - 表示應用程序用的是哪個語言
Platform - 表示應用程序是在什麼操作系統和/或平臺中運行
Encryption - 表示應用程序包含了什麼安全加密類型。其中的值可能是U(128位加密)、I(40位加密)、N(沒加密)。

Netscape Navigator 2 的 user-agent 字串的示例:
Mozilla/2.02 [fr] (WinNT; I)

上面的字串指: Netscape Navigator 2.02 、法語 、Windows NT 、40位加密。在當時,通過 user-agent 字串中的產品名稱,可以正確判斷使用的是哪個 web 瀏覽器。

Netscape Navigator 3 、Internet Explorer 3

1996年,Netscape Navigator 3 發佈,它遠遠超過 Mosaic 成爲當時最流行的 web 瀏覽器。而 user-agent 字串只有些小的變化:去掉了語言部分,多了個放操作系統或CPU的可選信息。格式如下:
Mozilla/Version (Platform; Encryption [; OS-or-CPU description])

在 Windows 系統中 Netscape Navigator 3 的 user-agent 字串的示例:
Mozilla/3.0 (Win95; U)

上面的字串指:Netscape Navigator 3 、Windows 95 、128 位加密。在 Windows 系統中,字串裏面不會顯示 OS 或 CPU 的信息。

Netscape Navigator 3 發佈不久,微軟公佈了它的首款 web 瀏覽器: IE 3 ¹,但是 Netscape 是當時首選瀏覽器,大多數服務器在加載頁面前都會檢查 user-agent 是否爲該款瀏覽器。IE 如果不兼容Netscape user-agent 字串,使用 IE 的用戶就根本打不開這些頁面,於是造就瞭如下格式:
Mozilla/2.0 (compatible; MSIE Version; Operating System)

在 Windows 95 中 IE 3.02 的 user-agent 字串的示例:
Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)

由於當時的瀏覽器嗅探只查 user-agent 字串中的產品名稱部分,結果 IE 搖身一變被識別成了 Mozilla,僞裝成 Netscape Navigator。這個做法引發了對瀏覽器識別的爭論。從此以後,瀏覽器真正的版本埋沒在了字串的中間。

Netscape Communicator 4 、Internet Explorer 4至8

1997年8月,Netscape Communicator 4 發佈(發佈的名稱中 Navigator 換成了 Communicator),它的 user-agent 字串格式與 3 版本一致。Windows 98 中 4 版本的 user-agent 字串如下:
Mozilla/4.0 (Win98; I)

Netscape 瀏覽器在更新時,版本也相應增加。4.79 版本的 user-agent 字串如下:
Mozilla/4.79 (Win98; I)

微軟發佈 IE 4 時,user-agent 字串更新了版本,格式如下:
Mozilla/4.0 (compatible; MSIE Version; Operating System)

在 Windows 98 中 IE 4 的 user-agent 字串的示例:
Mozilla/4.0 (compatible; MSIE 4.0; Windows 98)

可以看出,Mozilla 的版本與 IE 實際的版本一致,這樣就可以識別第4代瀏覽器了。但遺憾的是,不久 IE 4.5 馬上就發佈了(只在 Mac 平臺),雖然 Mozilla 版本仍是 4,但是 IE 的版本改成如下:
Mozilla/4.0 (compatible; MSIE 4.5; Mac_PowerPC)

此後,IE 的版本一直到 7 都沿用了這個模式。

而 IE 8 的 user-agent 字串添加了呈現引擎(rendering engine)版本:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)

新增的呈現引擎非常重要!這樣 IE8 以 MSIE 7.0 兼容模式運行時,Trident 版本保持不變,而原先 IE7 的 user-agent 字串不包括 Trident 版本。這樣可以區分 IE7 與 IE8 運行的兼容模式。

注意:別指望能從 Mozilla 版本中得到什麼靠譜的信息。

Gecko

Gecko 是 Firefox 的呈現引擎。Gecko 首次開發是作爲 Mozilla 瀏覽器 Netscape 6 的一部分。Netscape 6 的 user-agent 字串的結構是面向未來的,新版本反應出從 4.x 版本的簡單變得較爲複雜,它的格式如下:
Mozilla/MozillaVersion (Platform; Encryption; OS-or-CPU; Language; PrereleaseVersion)Gecko/GeckoVersion ApplicationProduct/ApplicationProductVersion

爲了更好的理解上面的 Gecko user-agent 字串格式,下面來看看各種從基於 Gecko 瀏覽器中取得的字串。

在 Windows XP 中的 Netscape 6.21:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:0.9.4) Gecko/20011128 Netscape6/6.2.1

在 Linux 中的 SeaMonkey 1.1a:
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1b2) Gecko/20060823 SeaMonkey/1.1a

在 Windows XP 中的 Firefox 2.0.0.11 :
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11

Mac OS X 中的 Camino 1.5.1:
Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en; rv:1.8.1.6) Gecko/20070809 Camino/1.5.1

上面都是基於 Gecko 的瀏覽器所取得的 user-agent 字串,區別只是版本有所不同。Mozilla 版本 5.0 是自從首款基於 Gecko 發佈後就一直不變,而且以後有可能也不會變²。

WebKit

2003年,Apple 宣佈發佈首款他們自主開發的 web 瀏覽器:Safari。它的呈現引擎叫 WebKit。它是 Linux 中的 web 瀏覽器 Konqueror 呈現引擎 KHTML 的一個分支,幾年後,WebKit 的開源吸引了呈現引擎的開發人員。

這款新瀏覽器和呈現引擎的開發人員也遇到了曾經 IE 3.0 類似的問題:怎樣才能溶入主流而不被踢出局?答案是:在 user-agent 字串中放詳盡的信息,以便騙取網站的信任使它與其它流行的瀏覽器兼容。user-agent 字串格式如下:
Mozilla/5.0 (Platform; Encryption; OS-or-CPU; Language) AppleWebKit/AppleWebKitVersion (KHTML, like Gecko) Safari/SafariVersion

下面是示例:
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko) Safari/125.1

這又是個挺長的 user-agent 字串,其中包括的信息既有 Apple WebKit 的版本,也有 Safari 的版本。凡是基於 WebKit 的瀏覽器都將自己僞裝成了 Mozilla 5.0,與基於 Gecko 瀏覽器完全一樣。但 Safari 的版本是瀏覽器的構建版本號(build number)。Safari 1.25 在 user-agent 字串中號爲 125.1(如上所示)。Safari 版本 3 的 user-agent 字串包括了實際的 Safari 版本:
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/522.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5

其中的“(KHTML, like Gecko)”在 Safari 1.0 預覽版本中就有了,這字串部分是最耐人尋味又飽受詬病。Apple 的野心是爲了讓開發人員把 Safari 當成 Gecko,所以採取了當初微軟 IE user-agent 的類似做法:Safari 是兼容 Mozilla 的,否則 Safari 用戶會認爲用的瀏覽器不受支持。

而其它基於 WebKit 的瀏覽器與 Safari 不同的是,沒有上面說的這個情況,所以檢測斷定瀏覽器是否基於 WebKit 比看有沒有明確標 Safari 更有用。

Konqueror

Konqueror 是款在 KDE Linux 桌面環境中的瀏覽器,基於 KHTML 開源呈現引擎。它只發布了在 Linux 的版本,但是擁有活躍的用戶羣。爲了兼容性最大化,user-agent 字串的格式也緊跟 IE 的後塵:
Mozilla/5.0 (compatible; Konqueror/Version; OS-or-CPU)

Konqueror 3.2 爲了與 WebKit user-agent 字串變化保持一致,它將 KHTML 作爲它的標識:
Mozilla/5.0 (compatible; Konqueror/Version; OS-or-CPU) KHTML/KHTMLVersion (like Gecko)

如下所示:
Mozilla/5.0 (compatible; Konqueror/3.5; SunOS) KHTML/3.5.0 (like Gecko)

Konqueror 和 KHTML 的版本號比較一致,唯一的區別就是下點處不同,比如Konquerer 3.5、KHTML 3.5.1。

Chrome

Google Chrome 瀏覽器以 WebKit 作爲呈現引擎,JavaScript 引擎卻用了另一種。最初發布的版本是 0.2,它的 user-agent 字串格式是在 webKit 信息的基礎上又增加了如下:
Mozilla/5.0 (Platform; Encryption; OS-or-CPU; Language) AppleWebKit/AppleWebKitVersion (KHTML, like Gecko) Chrome/ChromeVersion Safari/SafariVersion

Chrome 0.2 user-agent 信息的示例如下:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.29 Safari/525.13

雖我不敢完全保證,但很可能 WebKit 版本和 Safari 版本總會保持同步。

Opera

Opera 瀏覽器默認 user-agent 字串是現代瀏覽器中最合理的--正確的標識了它自己及其版本。 在 Opera 8.0 前,它的 user-agent 字串格式如下:
Opera/Version (OS-or-CPU; Encryption) [Language]

在 Windows XP 中 Opera 7.54 user-agent 字串示例:
Opera/7.54 (Windows NT 5.1; U) [en]

Opera 8 user-agent 字串的語言部分移到了括號內。
Opera/Version (OS-or-CPU; Encryption; Language)

在 Windows XP 中 Opera 8 user-agent 字串示例:
Opera/8.0 (Windows NT 5.1; U; en)

當時 Opera 做爲主流瀏覽器之一,它的 user-agent 字串是唯一使用產品名稱和版本完全真實的標識了它自己。但是由於大量的瀏覽器嗅探代碼在 Internet 上像蝗蟲飛過般只吃標 Mozilla 產品名的 user-agent 字串,造成了 Opera 的 user-agent 字串發生了完全的改變。

Opera 9 user-agent 字串有兩種修改的方式:一種方式是將自己標識爲 Firefox 或 IE 瀏覽器。在這種方式下,user-agent 字串與 Firefox 或 IE 的幾乎一樣,只不過末尾附加了“Opera”及版本號。如下所示:
Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50

Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50

前一字串將 Opera 9.5 標識爲 Firefox 2。後一字串將 Opera 9.5 標識爲 IE 6,在兩個字串中都帶有 Opera 版本信息。雖然這種方式是作爲 Firefox 或 IE 打開的,但也能識別出 Opera。另一種方法則是瀏覽器 user-agent 字串標識僞裝成 Firefox 或 IE,同時也找不到“Opera”字串及其版本信息。這樣從字面上去區分 Opera 瀏覽器便成了“不可能完成的任務”。³

結論

user-agent 字串史可以說明曾對 user-agent 嗅探說不的原因:IE 想要將自己識別爲 Netscape 4,Konqueror 和 WebKit 想要識別爲 Firefox,Chrome 想要識別爲 Safari。這樣使得除 Opera 外所有瀏覽器的 user-agent 嗅探區別很小,想要從一堆茫茫瀏覽器海洋中找出有用的標識太少了。關於嗅探要記住:一款瀏覽器與其它瀏覽器是兼容的,這樣造成了不能完全準確的斷定是哪款瀏覽器。

比如說 Chrome ,它聲稱任何可以在 Safari 3 訪問的網站 Chrome 也都可以訪問,但是對檢測 Chrome 沒有一點用。爲了瀏覽器的兼容–這便是這個聲明的理由。

(完)

譯註1:IE 3 不是微軟首款瀏覽器,請參考 wiki 的 Timeline of web browsers。

譯註2:這個是原作者的想法,譯者不敢保證。

譯註3:Opera 10 的 user-agent 字串大家自己去看吧。

發佈了11 篇原創文章 · 獲贊 11 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章