本片文章用戶接受,用戶代理字符串的一些歷史。即通過 navigator.userAgent 訪問得到的字符串。
HTTP規(guī)范(包括1.0 和 2.0)明確規(guī)定,瀏覽器應(yīng)該發(fā)送簡短的用戶代理字符串,指明瀏覽器的名稱和版本號。RFC2612(即HTTP1.1協(xié)議規(guī)范)是這樣描述用戶代理字符串的。
“產(chǎn)品標(biāo)識符常用于通信應(yīng)用程序標(biāo)識自身,由軟件名和版本組成。使用產(chǎn)品標(biāo)識符的大多數(shù)領(lǐng)域也允許列出作為應(yīng)用程序主要部分的子產(chǎn)品,由空格分割,按照慣例,產(chǎn)品要按照相應(yīng)的重要程度依次列出,以便標(biāo)識應(yīng)用程序?!?/p>
上述規(guī)范進(jìn)一步規(guī)定,字符串格式為:標(biāo)識符 / 產(chǎn)品版本號。但是現(xiàn)實中的用戶代理字符串絕沒有這么簡單。
1. 早期的瀏覽器
1993年,美國 NCSA( National Center for Supercomputing Applications, 國家超級計算機(jī)中心 )發(fā)布了世界上第一款 Web 瀏覽器 Mosaic。這款瀏覽器的用戶代碼字符串非常簡單。如下:
Mosaic / 0.9
正斜杠前面表示產(chǎn)品名稱,后面表示版本號
Netscape Communications(網(wǎng)景)公司介入瀏覽器開發(fā)領(lǐng)域后,將自己的產(chǎn)品的代碼定名為 Mozilla( Mosaic Killer 的簡寫,意即 Mosaic殺手)。該公司的第一個公共發(fā)行版瀏覽器Netscape Navigator 2的用戶代理字符串如下:
Mozilla / 版本號 [語言] (平臺; 加密類型)
Netscape 在堅持將產(chǎn)品和版本號作為用戶代理字符串開頭的基礎(chǔ)上,又在后面依次添加了下列信息。
- 語言:即語言代碼,表示應(yīng)用程序針對哪種語言設(shè)計。
- 平臺:即操作系統(tǒng)和(或)平臺,表示應(yīng)用程序的允許環(huán)境
-
加密類型:即安全加密類型??赡艿闹涤校?
- U:123位加密
- I:40位加密
- N:未加密
典型的 Netscape Navigator2的用戶代理字符串如下:
Mozilla / 2.02 [fr] (WinNT: I)
這個字符串是 Netscape Navigator 2.02,為法語國家編譯,運(yùn)行在 Windows NT平臺下,加密類型為40位
2. Netscape Navigator 和 Internet Explorer3
1996年,Netscape Navigator 3 發(fā)布,隨機(jī)超越Mosaic稱為當(dāng)時最流行的Web瀏覽器。而用戶代理字符串只作了一些小的改變,刪除了語言標(biāo)記,同時允許添加操作系統(tǒng)或系統(tǒng)使用的CPU等可選信息。格式如下:
Mozilla/版本號 (平臺; 加密類型 [; 操作系統(tǒng)或 CPU說明])
運(yùn)行在 Windows 系統(tǒng)下的 Netscape Navigator 3 的用戶代理字符串大致如下。
Mozilla/3.0 (win95; U)
表示 Netscape Navigator 3 運(yùn)行在 Windows 95中,采用了 128位加密技術(shù)??梢姡赪indows 系統(tǒng)中,字符串中的操作系統(tǒng)或CPU說明被省略了。
Netscaoe Navigator 3發(fā)布后不久,微軟也發(fā)布了其第一款贏得用戶廣泛認(rèn)可的 Web瀏覽器,即Internet Explorer 3。由于 Netscape 的瀏覽器在當(dāng)視占絕對市場份額,許多服務(wù)器在提供網(wǎng)頁之前都要專門檢測瀏覽器。如果用戶通過IE打不開相關(guān)網(wǎng)頁,那么這個新生的瀏覽器很可能就會夭折。于是,微軟絕定將IE的用戶代理字符串修改成兼容 Netscape 的形式如下:
Mozilla/2.0 (compatible; MSIE 版本號; 操作系統(tǒng))
例如,windows95平臺下的 Internet Explorer 3.02帶用如下用戶代理字符串
Mozilla/2.0 (compatible; MSIE 3.02; windows 95)
由于當(dāng)時大多數(shù)瀏覽器嗅探程序只堅持用戶代理字符串中的產(chǎn)品名稱部分,結(jié)果IE就成功地將自己標(biāo)識位Mozilla,從而偽裝成 Netscape Navigator。微軟的這一做法招致了很多批評,因為它違反了瀏覽器標(biāo)識的慣例。更不規(guī)范的是,IE將真正的瀏覽器版本號插入到字符串的中間。
字符串中另外一個有趣的地方是標(biāo)識符 Mozilla 2.0(而不是3.0)。畢竟當(dāng)視的主流版本是 3.0,改成3.0 應(yīng)該對微軟更有利才對。但是真正的謎底到現(xiàn)在還沒有揭開——但很可能只是人為的疏忽。
3. Netscape Communicator 4 和 IE4~IE8
1997年 8月,Netscape Communicator 4發(fā)布(這一版將瀏覽器 名字中的 Navigator 換成了 Communicator)。Netscape繼續(xù)遵循了第三版的用戶代理字符串的格式:
Mozilla/版本號 (平臺; 加密類型 [; 操作系統(tǒng)或CPU說明])
因此 Netscape Communicator4 在Windows 98平臺中第四版的用戶代理字符會如下:
Mozilla/4.0 (Win98; I)
Netscape在發(fā)布補(bǔ)丁時,自版本號也會相應(yīng)的提高,用戶代理字符串如下面的4.79版所示:
Mozilla/4.79 (Win98; I)
但是,微軟在發(fā)布Internet Explorer4時,順便將用戶代理字符串修改成了如下格式:
Mozilla/4.0 (compatible; MSIE 版本號; 操作系統(tǒng))
對于Windows 98中運(yùn)行的IE4 而言,其用戶代理字符串位:
Mozilla/4.0 (compatible; MSIE 4.0; Windows 98)
經(jīng)過這次修改,Mozilla 版本號就與實際的IE版本號一致了,為識別它們的第四代瀏覽器提供了方便。但令人遺憾的是,兩者的一致性僅限于這一個版本。在Internet Explorer4.5發(fā)布時(中針對于 Macs),Mozilla的版本號依然是4;
Mozilla/4.0 (compatible; MSIE 4.5; Mac_PowerPC)
此后,IE的版本一直到7都沿襲了這個模式:
Mozilla/4.0 (compatible; MSIE 4.5; Windows NT 5.1)
而IE8的用戶代理字符串添加了呈現(xiàn)引擎(Trident)的版本號:
Mozilla/4.0 (compatible; MSIE 版本號; 操作系統(tǒng); Trident/Trident 版本號)
例如:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)
這個新增的 Trident 記號是為了讓開發(fā)人員知道 IE8 是不是在兼容模式下運(yùn)行。如果是,則MSIE的版本號會變成7, 但Trident 及版本號還會留在用戶代碼字符串中。
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)
鄭家這個記號有助于分辨瀏覽器到底是IE7(MSIE版本為7,且沒有Trident記號),還是運(yùn)行在兼容模式下的IE8(MSIE版本為7,有Trident記號)
IE9對字符串格式作了一點調(diào)整。Mozilla版本號增加到了5.0,而Trident的版本號也升到了5.0。:
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
這些變化都是為了確保過去的用戶代理檢測腳本能夠繼續(xù)發(fā)揮作用,同時還能給新腳本提供更豐富的信息。
4. Gecko
Gecko 是 Firefox 的呈現(xiàn)引擎。當(dāng)場的Gecko 是作為通用的 Mozilla 瀏覽器的一部分開發(fā)的,而第一個采用 Gecko 引擎的瀏覽器是 Netscape 6。為Netscape6 編寫了一份規(guī)范中規(guī)定了為了版本中用戶代理字符串的構(gòu)成。這個版本格式于4.x相比,有著很大的區(qū)別,如下:
Mozilla/Mozilla 版本號 (平臺; 加密類型; 操作系統(tǒng)或CPU; 語言; 預(yù)先發(fā)行版本; Gecko/Gecko 版本號 應(yīng)用程序或產(chǎn)品/應(yīng)用程序或產(chǎn)品版本號)
這個明顯復(fù)雜了很多的用戶代理字符串中蘊(yùn)含很多新想法。
| 字符串項 | 必需嗎 | 說明 |
|---|---|---|
| Mozilla版本號 | 是 | Mozilla的版本號 |
| 平臺 | 是 | 瀏覽器運(yùn)行的平臺??赡艿闹蛋╓indows、Mac和X1(指Unix的X窗口系統(tǒng)) |
| 加密類型 | 是 | 加密技術(shù)的樂喜:U(128位)、I(40位)、N(未加密) |
| 操作系統(tǒng)或CPU | 是 | 瀏覽器運(yùn)行的操作系統(tǒng)或計算機(jī)系統(tǒng)使用的CPU。在Windows平臺下指Windows的版本(如WinNT、Win95等待)。如果平臺是Mac,指CPU(針對PowerPC的68K、PPC或NacIntel)。如果平臺是X11,這一項是Unix操作系統(tǒng)的名稱,于使用Unix命令uname-sm得到的名稱相同。 |
| 語言 | 是 | 瀏覽器設(shè)計時所針對的用戶語言 |
| 預(yù)先發(fā)行版本 | 否 | 最初用于表示Mozilla的預(yù)先發(fā)行版本,現(xiàn)在則用來表示Gecko程序引擎的版本號 |
| Gecko版本號 | 是 | Gecko呈現(xiàn)引擎的版本號,但由yyyymmdd格式的日期表示 |
| 應(yīng)用程序或產(chǎn)品 | 否 | 使用Gecko的產(chǎn)品名??赡苁荖etscape、Firefox等 |
| 應(yīng)用程序或產(chǎn)品版本號 | 否 | 應(yīng)用程序或產(chǎn)品的版本號;用于區(qū)分Mozilla版本號和Gecko版本號 |
為了更好理解Gecko的用戶代理字符串,下面展示幾個基于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 1689; en-US; rv:1.8.1b2) Gecko/20060832 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的瀏覽器(只是版本不同)。每個字符串中的Mozilla 版本都是5.0,自從第一個居于Gecko的瀏覽器發(fā)布時修改成這個樣子,至今就沒有改變過;而且,看起來以后似乎也不會有什么變化。
關(guān)于 Firefox 與 Netscape的關(guān)系。
到了 Windows 98時代將IE與Windows 98捆綁在一起免費(fèi)提供,結(jié)果在很短的時間內(nèi)Netscape的用戶群體迅速萎縮,市場占有率急劇下降。面對微軟的強(qiáng)大威脅,Netscape在1998年11月決定將軟件免費(fèi)、且公開所有的程序源碼。這個措施幾乎還沒來得及實施, Netscape就被AOL美國在線所收購。AOL并非是想開發(fā)瀏覽器同微軟的IE競爭,而是將它作為對微軟的反壟斷案的一個籌碼。之后, Netscape雖然陸續(xù)發(fā)展出4.X、6.X系列乃至7.X系列,但都毫無影響力可言。微軟與AOL的反壟斷官司在2003年5月完結(jié), Netscape項目在7月份就被AOL凍結(jié)并將大部分Netscape 開發(fā)人員解雇,到此為止屬于Netscape的時代就完全結(jié)束了。不過AOL還是作了一件好事,所有的Netscape原始代碼被送給開源社群自行開發(fā),同時協(xié)助成立了非盈利性的“Mozilla基金會(Mozilla Foundation)”,它也是現(xiàn)在Firefox瀏覽器的管理和推進(jìn)組織。
隨著 Firefox 4 發(fā)布,Mozilla 簡化了這個用戶代理字符串。主要改變包括以下幾方面。
- 刪除了 “語言” 記號(例如,前面例子中的“en-US”)
- 在瀏覽器中使用強(qiáng)加密(U/128位,默認(rèn)設(shè)置)時,不現(xiàn)實“加密類型”。也就是說(只有 I 、 N 會出現(xiàn))
- “平臺”記號從Windows 用戶代理字符串中刪除了,“操作系統(tǒng)或 CPU”中始終都包含“Windows”字符串
- “Gecko版本號” 固定為 “Gecko/20100101”
最后,F(xiàn)irefox4用戶代理字符串變成下面這個樣子:
Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox 4.0.1
5. Webkit
2003年,Apple公司宣布要發(fā)布自己的Web瀏覽器,名字為Safari。Safari的呈現(xiàn)引擎叫 Webkit,是 Linux 平臺中 Konqueror 瀏覽器的呈現(xiàn)引擎 KHTML 的一個分支。幾年后,WebKit 獨立出來成為了一個開源項目,專注于呈現(xiàn)引擎的開發(fā)。
這款瀏覽器也遇到和IE3一樣的問題;如何確保這款瀏覽器不會被流行的站點拒之門外?答案就是向用戶代理字符串中放入足夠多的信息,以便站點能夠信任它與其他流行的瀏覽器是兼容的。
Mozilla/5.0 (平臺; 加密類型; 操作系統(tǒng)或CPU; 語言) AppleWebkit/AppleWebKit版本號
實例:
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/123 (KHTML, like Gecko)
出于兼容性考慮,有關(guān)人員很快就決定將Safari標(biāo)識為Mozilla。至今,基于Webkit的所有瀏覽器都將自己表示為Mozilla 5.0,與基于 Gecko 的瀏覽器完全一樣。
Safari 預(yù)發(fā)行 1.0 版用戶代理字符串中最耐人尋味,也是最飽受詬病的部分是字符串(KHTML like Gecko); Apple的回應(yīng)與 IE最初時一樣:Safari 與 Mozilla 兼容,因此網(wǎng)站不應(yīng)該將 Safari 用戶拒之門外,否則用戶就會認(rèn)為自己的瀏覽器不受支持。
Safari3.0發(fā)布時,增加了 Version 記號,沿用至今。
Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebkit/622.15.5 (KHTML, like Gecko) Version/3.0.3 Safari/522.15.5
這個變化只有Safari中有,在Webkit 中沒有。也就是說,其他基于webkit 的瀏覽器沒有這個變化。
6. Konqueror
與 KDE Linux 繼承的 Konqueror,是一款基于 KHTML 開源呈現(xiàn)引擎的瀏覽器。盡管Konqueror 只能在 Linux中使用,但它也有數(shù)量可觀的用戶。為了確保最大限度的兼容性,Konqueror效仿 IE 選擇了如下用戶代理字符串格式。
Mozilla/5.0 (compatible; Konqueror/ 版本號; 操作系統(tǒng)或CPU )
不過為了與Webkit的用戶代理字符串的變化保持一致,Konqueror 3.2 又有了變化,以如下格式將自己標(biāo)識位 KHTML
Mozilla/5.0 (compatible; Konqueror/3.5; SunOS) KHTML/3.5.0 (like Gecko)
其中,Konqueror 與 KHTML 的版本號比較一致,即使有差別也很小,例如 Konqueror 3.5使用 KHTML 3.5.1
Chrome
谷歌公司的 Chrome 瀏覽器以Webkit 作為呈現(xiàn)引擎,但使用了不同的JavaScript引擎(V8)。在Chrome0.2這個最初的beta版中,用戶代理字符串完全取自 Webkit,只添加了一段表示 Chrome 版本號的信息,格式如下:
Mozilla/5.0 (平臺; 加密類型; 操作系統(tǒng) CPU; 語言) AppleWebkit/AppleWebkit版本號 (KHTML, like Gecko) Chrome/ Chrome 版本號 Safari/ Safari 版本
Chrome 7 的完整用戶代理字符串如下:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7
其中,WebKit 版本 與 Safari 版本看起來似乎始終會保持一致,盡管沒有十分的把握。
8. Opera
僅就用戶代理字符串而言,Opera 應(yīng)該是最有爭議的一款瀏覽器了。Opera 默認(rèn)的用戶代理字符串時所有現(xiàn)代瀏覽器中最合理的——正確地標(biāo)識了自身及其版本號。在Opera8.0之前,采用如下格式:
Opera/ 版本號 (操作系統(tǒng)或CPU; 加密類型) [語言]
Windows XP中的 Opera7.54 會顯示如下用戶代理字符串:
Opera/7.54 (Windows NT 5.1; U) [en]
Opera8發(fā)布以后,用戶代理字符串的“語言”部分被移到圓括號內(nèi),以便更好地與其他瀏覽器匹配,如下:
Opera/版本號 (操作系統(tǒng)或CPU; 加密類型; 語言)
Windows XP中的Opera 8 會顯示下面的用戶代理字符串:
Opera/8.0 (Windows Nt 5.1; U; en)
默認(rèn)情況下,Opera會以上面這種簡單的格式返回一個用戶代理字符串。目前來看,Opera也是主要瀏覽器中唯一一個使用產(chǎn)品名和版本號來完全徹底標(biāo)識自身的瀏覽器。Opera沒有選擇通過修改自身的用戶代理字符串來迷惑嗅探代碼,而實干脆選擇通過修改自身的用戶代理字符串將自身標(biāo)識位一個完全不同的瀏覽器。
Opera9以后,出現(xiàn)了兩種修改自身用戶代理字符串的方式
第一種:將自身標(biāo)識位另一個瀏覽器,如Firefox 或者 IE。在這情況下,用戶代理字符串就如同 其他瀏覽器的 用戶代理字符串一樣,只不過末尾追加了字符串 Opera 及 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
以上分別標(biāo)識位 Firefox 2, IE6
第二種:就是把自己裝扮成Firefox或IE。在這種隱瞞真實身份的情況下,既沒有Opera字樣,也不包含Opera的版本信息。另外,由于Opera喜歡在不告知用戶的情況下針對站點來設(shè)置用戶代理字符串,因此問題就更復(fù)雜化了。例如:打開 MyYahoo!站點(http://my.yahoo.com)會自動導(dǎo)致Opera將自己裝扮成 Firefox。如此依賴,想要識別Opera就難上加難了。
在 Opera10中對代理字符串進(jìn)行了修改?,F(xiàn)在的格式是:
Opera/9.80 (操作系統(tǒng)或CPU; 加密類型; 語言) Presto/Presto 版本號 Version/版本號
初始版本號 Opera/9.80 是固定不變的。實際并沒有 Opera 9.8,但工程師們擔(dān)心寫得不好的瀏覽器嗅探腳本會將 Opera/10.0 錯誤的解釋位 Opera 1, 因此,Opera 10又增加了Presto記號( Presto 是 Opera 的呈現(xiàn)引擎) 和 Version 記號。
以下是Windows 7 中 Opera 10.63 的用戶代理字符串:
Opera/9.08 (windows NT 6.1; U; en) Presto/2.6.30 Version/10.63
ISO 和 Android
移動早做系統(tǒng)ISO 和 Android 默認(rèn)的瀏覽器都基于 WebKit,而且都像它們的桌面版一樣,共享相同的基本用戶代理字符串格式。ISO設(shè)備的基本格式如下:
Mozilla/5.0 (平臺; 加密類型; 操作系統(tǒng)或CPU like Mac OS X; 語言) AppleWebKit/AppleWebKit 版本號 (KHTML, like Gecko) Version/瀏覽器版本號 Mobile/移動版本號 Safari/Safari 版本號
注意用于輔助確定 Mac 操作系統(tǒng)的 “l(fā)ike Mac OS X”和額外的 Mobile記號。Mobile主要是用來確定 Webkit是移動版,而非桌面版。
Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us ) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16
在IOS3之前,用戶代理字符串中不會出現(xiàn)操作系統(tǒng)版本號
Android瀏覽器中的默認(rèn)格式與IOS的格式相似,沒有移動版本號(但又Mobile記號)。例如:
Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
以上是Google Nexus One 手機(jī)的用戶代理字符串。不過其他Android 設(shè)備的模式也一樣。