職業(yè):認(rèn)識(shí)User-Agent

需要了解nginx 配置中http_user_agent變量,搜索到User-Agent的資料,先看看:

一、什么是User-Agent

User-Agent是Http協(xié)議中的一部分,屬于頭域的組成部分,User Agent也簡(jiǎn)稱UA。用較為普通的一點(diǎn)來說,是一種向訪問網(wǎng)站提供你所使用的瀏覽器類型、操作系統(tǒng)及版本、CPU 類型、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等信息的標(biāo)識(shí)。UA字符串在每次瀏覽器 HTTP 請(qǐng)求時(shí)發(fā)送到服務(wù)器!

瀏覽器UA 字串的標(biāo)準(zhǔn)格式為: 瀏覽器標(biāo)識(shí) (操作系統(tǒng)標(biāo)識(shí); 加密等級(jí)標(biāo)識(shí); 瀏覽器語言) 渲染引擎標(biāo)識(shí) 版本信息

  操作系統(tǒng)標(biāo)識(shí)

  FreeBSD

  X11; FreeBSD (version no.) i386

  X11; FreeBSD (version no.) AMD64

  Linux

  X11; Linux ppc

  X11; Linux ppc64

  X11; Linux i686

  X11; Linux x86_64

  Mac

  Macintosh; PPC Mac OS X

  Macintosh; Intel Mac OS X

  Solaris

  X11; SunOS i86pc

  X11; SunOS sun4u

  Windows:

  Windows NT 6.1 對(duì)應(yīng)操作系統(tǒng) windows 7

  Windows NT 6.0 對(duì)應(yīng)操作系統(tǒng) windows vista

  Windows NT 5.2 對(duì)應(yīng)操作系統(tǒng) windows 2003

  Windows NT 5.1 對(duì)應(yīng)操作系統(tǒng) windows xp

  Windows NT 5.0 對(duì)應(yīng)操作系統(tǒng) windows 2000

  Windows ME

  Windows 98

  加密等級(jí)標(biāo)識(shí)

  N: 表示無安全加密

  I: 表示弱安全加密

  U: 表示強(qiáng)安全加密

  瀏覽器語言

  在首選項(xiàng) > 常規(guī) > 語言中指定的語言

  渲染引擎

  瀏覽器 使用 Presto 渲染引擎,格式為: Presto/版本號(hào)

  版本信息

  顯示 瀏覽器 真實(shí)版本信息,格式為: Version/版本號(hào)

二、User-Agent的歷史

1993年,NCSA 發(fā)布了首款 web 瀏覽器 Mosaic。它的 user-agent 字串非常簡(jiǎn)潔:

  Mosaic/0.9雖然當(dāng)時(shí)由于它對(duì)操作系統(tǒng)和平臺(tái)的依賴性,但是基本格式還是很簡(jiǎn)單明了。在文本中,斜杠前面是產(chǎn)品名稱(可能會(huì)顯示為 NCSA Mosaic 或是其他類似的字),斜杠后面是產(chǎn)品版本號(hào)。

  Netscape Communications 開發(fā)了 web 瀏覽器 Mozilla(當(dāng)時(shí)號(hào)稱“Mosaic 殺手”)。他們首款公開發(fā)行版本: Netscape Navigator 2 的user-agent 字串具有如下格式:

  Mozilla/Version [Language] (Platform; Encryption)Netscape 按之前的做法在 user-agent 字串的前半部分使用了產(chǎn)品名稱和產(chǎn)品版本,但在后面增加了下列信息:

  Language - 表示應(yīng)用程序用的是哪個(gè)語言 Platform - 表示應(yīng)用程序是在什么操作系統(tǒng)和/或平臺(tái)中運(yùn)行 Encryption - 表示應(yīng)用程序包含了什么安全加密類型。其中的值可能是U(128位加密)、I(40位加密)、N(沒加密)。 Netscape Navigator 2 的user-agent 字串的示例:

  Mozilla/2.02 [fr] (WinNT; I)上面的字串指: Netscape Navigator 2.02 、法語 、Windows NT 、40位加密。在當(dāng)時(shí),通過user-agent 字串中的產(chǎn)品名稱,可以正確判斷使用的是哪個(gè) web 瀏覽器。Netscape Navigator 3 、Internet Explorer 3 1996年,Netscape Navigator 3 發(fā)布,它遠(yuǎn)遠(yuǎn)超過 Mosaic 成為當(dāng)時(shí)最流行的 web 瀏覽器。而user-agent 字串只有些小的變化:去掉了語言部分,多了個(gè)放操作系統(tǒng)或CPU的可選信息。格式如下:

  Mozilla/Version (Platform; Encryption [; OS-or-CPU description])在 Windows 系統(tǒng)中 Netscape Navigator 3 的user-agent 字串的示例:

  Mozilla/3.0 (Win95; U)上面的字串指:Netscape Navigator 3 、Windows 95 、128 位加密。在 Windows 系統(tǒng)中,字串里面不會(huì)顯示 OS 或 CPU 的信息。

  Netscape Navigator 3 發(fā)布不久,微軟公布了它的首款 web 瀏覽器: IE 3 1,但是 Netscape 是當(dāng)時(shí)首選瀏覽器,大多數(shù)服務(wù)器在加載頁面前都會(huì)檢查 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)由于當(dāng)時(shí)的瀏覽器嗅探只查 user-agent 字串中的產(chǎn)品名稱部分,結(jié)果 IE 搖身一變被識(shí)別成了 Mozilla,偽裝成 Netscape Navigator。這個(gè)做法引發(fā)了對(duì)瀏覽器識(shí)別的爭(zhēng)論。從此以后,瀏覽器真正的版本埋沒在了字串的中間。Netscape Communicator 4 、Internet Explorer 4至8 1997年8月,Netscape Communicator 4 發(fā)布(發(fā)布的名稱中 Navigator 換成了 Communicator),它的 user-agent 字串格式與 3 版本一致。Windows 98 中 4 版本的user-agent 字串如下:

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

  Mozilla/4.79 (Win98; I)微軟發(fā)布 IE 4 時(shí),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 實(shí)際的版本一致,這樣就可以識(shí)別第4代瀏覽器了。但遺憾的是,不久 IE 4.5 馬上就發(fā)布了(只在 Mac 平臺(tái)),雖然 Mozilla 版本仍是 4,但是 IE 的版本改成如下:

  Mozilla/4.0 (compatible; MSIE 4.5; Mac_PowerPC)此后,IE 的版本一直到 7 都沿用了這個(gè)模式。

  而 IE 8 的 user-agent 字串添加了呈現(xiàn)引擎(rendering engine)版本:

  Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)新增的呈現(xiàn)引擎非常重要!這樣 IE8 以 MSIE 7.0 兼容模式運(yùn)行時(shí),Trident 版本保持不變,而原先 IE7 的user-agent 字串不包括 Trident 版本。這樣可以區(qū)分 IE7 與 IE8 運(yùn)行的兼容模式。

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

Gecko

  Gecko 是 Firefox 的呈現(xiàn)引擎。Gecko 首次開發(fā)是作為 Mozilla 瀏覽器 Netscape 6 的一部分。Netscape 6 的user-agent 字串的結(jié)構(gòu)是面向未來的,新版本反應(yīng)出從 4.x 版本的簡(jiǎn)單變得較為復(fù)雜,它的格式如下:

  Mozilla/MozillaVersion (Platform; Encryption; OS-or-CPU; Language; PrereleaseVersion)Gecko/GeckoVersion ApplicationProduct/ApplicationProductVersion為了更好的理解上面的 Geckouser-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.11Mac 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 字串,區(qū)別只是版本有所不同。Mozilla 版本 5.0 是自從首款基于 Gecko 發(fā)布后就一直不變,而且以后有可能也不會(huì)變2。

WebKit

  2003年,Apple 宣布發(fā)布首款他們自主開發(fā)的 web 瀏覽器:Safari。它的呈現(xiàn)引擎叫 WebKit。它是 Linux 中的 web 瀏覽器 Konqueror 呈現(xiàn)引擎 KHTML 的一個(gè)分支,幾年后,WebKit 的開源吸引了呈現(xiàn)引擎的開發(fā)人員。

  這款新瀏覽器和呈現(xiàn)引擎的開發(fā)人員也遇到了曾經(jīng) IE 3.0 類似的問題:怎樣才能溶入主流而不被踢出局?答案是:在 user-agent 字串中放詳盡的信息,以便騙取網(wǎng)站的信任使它與其它流行的瀏覽器兼容。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這又是個(gè)挺長的user-agent 字串,其中包括的信息既有 Apple WebKit 的版本,也有 Safari 的版本。凡是基于 WebKit 的瀏覽器都將自己偽裝成了 Mozilla 5.0,與基于 Gecko 瀏覽器完全一樣。但 Safari 的版本是瀏覽器的構(gòu)建版本號(hào)(build number)。Safari 1.25 在user-agent 字串中號(hào)為 125.1(如上所示)。Safari 版本 3 的user-agent 字串包括了實(shí)際的 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 預(yù)覽版本中就有了,這字串部分是最耐人尋味又飽受詬病。Apple 的野心是為了讓開發(fā)人員把 Safari 當(dāng)成 Gecko,所以采取了當(dāng)初微軟 IEuser-agent 的類似做法:Safari 是兼容 Mozilla 的,否則 Safari 用戶會(huì)認(rèn)為用的瀏覽器不受支持。

  而其它基于 WebKit 的瀏覽器與 Safari 不同的是,沒有上面說的這個(gè)情況,所以檢測(cè)斷定瀏覽器是否基于 WebKit 比看有沒有明確標(biāo) Safari 更有用。

Konqueror

  Konqueror 是款在 KDE Linux 桌面環(huán)境中的瀏覽器,基于 KHTML 開源呈現(xiàn)引擎。它只發(fā)布了在 Linux 的版本,但是擁有活躍的用戶群。為了兼容性最大化,user-agent 字串的格式也緊跟 IE 的后塵:

  Mozilla/5.0 (compatible; Konqueror/Version; OS-or-CPU)Konqueror 3.2 為了與 WebKituser-agent 字串變化保持一致,它將 KHTML 作為它的標(biāo)識(shí):

  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 的版本號(hào)比較一致,唯一的區(qū)別就是下點(diǎn)處不同,比如Konquerer 3.5、KHTML 3.5.1。

Chrome

  Google Chrome 瀏覽器以 WebKit 作為呈現(xiàn)引擎,JavaScript 引擎卻用了另一種。最初發(fā)布的版本是 0.2,它的 user-agent 字串格式是在 webKit 信息的基礎(chǔ)上又增加了如下:

  Mozilla/5.0 (Platform; Encryption; OS-or-CPU; Language) AppleWebKit/AppleWebKitVersion (KHTML, like Gecko) Chrome/ChromeVersion Safari/SafariVersionChrome 0.2user-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 版本總會(huì)保持同步。

Opera

  Opera 瀏覽器默認(rèn) user-agent 字串是現(xiàn)代瀏覽器中最合理的--正確的標(biāo)識(shí)了它自己及其版本。 在 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 字串的語言部分移到了括號(hào)內(nèi)。

  Opera/Version (OS-or-CPU; Encryption; Language)在 Windows XP 中 Opera 8 user-agent 字串示例:

  Opera/8.0 (Windows NT 5.1; U; en)當(dāng)時(shí) Opera 做為主流瀏覽器之一,它的 user-agent 字串是唯一使用產(chǎn)品名稱和版本完全真實(shí)的標(biāo)識(shí)了它自己。但是由于大量的瀏覽器嗅探代碼在 Internet 上像蝗蟲飛過般只吃標(biāo) Mozilla 產(chǎn)品名的user-agent 字串,造成了 Opera 的user-agent 字串發(fā)生了完全的改變。

  Opera 9 user-agent 字串有兩種修改的方式:一種方式是將自己標(biāo)識(shí)為 Firefox 或 IE 瀏覽器。在這種方式下,user-agent 字串與 Firefox 或 IE 的幾乎一樣,只不過末尾附加了“Opera”及版本號(hào)。如下所示:

  Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50前一字串將 Opera 9.5 標(biāo)識(shí)為 Firefox 2。后一字串將 Opera 9.5 標(biāo)識(shí)為 IE 6,在兩個(gè)字串中都帶有 Opera 版本信息。雖然這種方式是作為 Firefox 或 IE 打開的,但也能識(shí)別出 Opera。另一種方法則是瀏覽器 user-agent 字串標(biāo)識(shí)偽裝成 Firefox 或 IE,同時(shí)也找不到“Opera”字串及其版本信息。這樣從字面上去區(qū)分 Opera 瀏覽器便成了“不可能完成的任務(wù)”。

結(jié)論

  user-agent 字串史可以說明曾對(duì) user-agent 嗅探說不的原因:IE 想要將自己識(shí)別為 Netscape 4,Konqueror 和 WebKit 想要識(shí)別為 Firefox,Chrome 想要識(shí)別為 Safari。這樣使得除 Opera 外所有瀏覽器的user-agent 嗅探區(qū)別很小,想要從一堆茫茫瀏覽器海洋中找出有用的標(biāo)識(shí)太少了。關(guān)于嗅探要記?。阂豢顬g覽器與其它瀏覽器是兼容的,這樣造成了不能完全準(zhǔn)確的斷定是哪款瀏覽器。

  比如說 Chrome ,它聲稱任何可以在 Safari 3 訪問的網(wǎng)站 Chrome 也都可以訪問,但是對(duì)檢測(cè) Chrome 沒有一點(diǎn)用。為了瀏覽器的兼容--這便是這個(gè)聲明的理由。

三、user-agent的作用

根據(jù)前面介紹的user-agent的歷史我們知道,通過user-agent不能完全準(zhǔn)確的判斷是屬于那款瀏覽器。由于UA字符串在每次瀏覽器HTTP 請(qǐng)求時(shí)發(fā)送到服務(wù)器,所以服務(wù)器就可以根據(jù)它來做好多事。

比如:

1、統(tǒng)計(jì)用戶瀏覽器使用情況。有些瀏覽器說被多少人使用了,實(shí)際上就可以通過判斷每個(gè)IP的UA來確定這個(gè)IP是用什么瀏覽器訪問的,以得到使用量的數(shù)據(jù)。

2、根據(jù)用戶使用瀏覽器的不同,顯示不同的排版從而為用戶提供更好的體驗(yàn)。有些網(wǎng)站會(huì)根據(jù)這個(gè)來調(diào)整打開網(wǎng)站的類型,如是手機(jī)的就打開wap,顯示非手機(jī)的就打開pc常規(guī)頁面。用手機(jī)訪問谷歌和電腦訪問是不一樣的,這些是谷歌根據(jù)訪問者的UA來判斷的。

既然知道了UA的作用,那么其實(shí)客戶端也可以使用UA來做一些神奇的事。

比如:偽裝 user agent 來回避某些偵測(cè)特定瀏覽器才能讀取的網(wǎng)站。

如果使用Firefox瀏覽器插件User agent switcher,用戶就可以輕松地在不同UA之間切換,把自己偽裝成其他瀏覽器。這樣就可以在PC上預(yù)覽WAP或移動(dòng)格式的網(wǎng)頁,比如專門為iPhone設(shè)計(jì)的頁面。

四、獲得user-agent的值

既然已經(jīng)知道user-agent是http的頭域,那我們?cè)诰幊痰臅r(shí)候就可以獲得它。

在 ASP.NET 中使用 Request.Header["User-Agent"] 得到瀏覽器的 User Agent,也可以使用 Request.UserAgent 來獲取;

Java 中使用 request.getHeader(”User-Agent”) 來獲得;

PHP 中相應(yīng)使用:$_SERVER[HTTP_USER_AGENT];

JS中則使用navigator.userAgent來獲得(是否記得在客戶端經(jīng)常使用它來做瀏覽器兼容呢)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容