本片文章用戶接受,用戶代理字符串的一些歷史飒炎。即通過 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)用程序∏耄”
上述規(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,為法語國家編譯窘行,運行在 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說明])
運行在 Windows 系統(tǒng)下的 Netscape Navigator 3 的用戶代理字符串大致如下。
Mozilla/3.0 (win95; U)
表示 Netscape Navigator 3 運行在 Windows 95中纬黎,采用了 128位加密技術(shù)幅骄。可見本今,在Windows 系統(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中運行的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 是不是在兼容模式下運行。如果是车海,則MSIE的版本號會變成7, 但Trident 及版本號還會留在用戶代碼字符串中。
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)
鄭家這個記號有助于分辨瀏覽器到底是IE7(MSIE版本為7脊串,且沒有Trident記號)比勉,還是運行在兼容模式下的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ù)雜了很多的用戶代理字符串中蘊含很多新想法。
字符串項 | 必需嗎 | 說明 |
---|---|---|
Mozilla版本號 | 是 | Mozilla的版本號 |
平臺 | 是 | 瀏覽器運行的平臺≈擅可能的值包括Windows纸淮、Mac和X1(指Unix的X窗口系統(tǒng)) |
加密類型 | 是 | 加密技術(shù)的樂喜:U(128位)、I(40位)亚享、N(未加密) |
操作系統(tǒng)或CPU | 是 | 瀏覽器運行的操作系統(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)品名燥筷÷嵯椋可能是Netscape、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捆綁在一起免費提供村视,結(jié)果在很短的時間內(nèi)Netscape的用戶群體迅速萎縮,市場占有率急劇下降酒奶。面對微軟的強(qiáng)大威脅蚁孔,Netscape在1998年11月決定將軟件免費、且公開所有的程序源碼惋嚎。這個措施幾乎還沒來得及實施杠氢, 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)行了修改』笨牵現(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è)備的模式也一樣特幔。