1. 程式人生 > >User-Agent詳解

User-Agent詳解

轉載:https://blog.csdn.net/xinyuan_java/article/details/66092335

一、什麼是User-Agent

User-Agent是Http協議中的一部分,屬於頭域的組成部分,User Agent也簡稱UA。用較為普通的一點來說,是一種向訪問網站提供你所使用的瀏覽器型別、作業系統及版本、CPU 型別、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等資訊的標識。UA字串在每次瀏覽器 HTTP 請求時傳送到伺服器!

瀏覽器UA 字串的標準格式為: 瀏覽器標識 (作業系統標識; 加密等級標識; 瀏覽器語言) 渲染引擎標識 版本資訊

  作業系統標識

  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 對應作業系統 windows 7

  Windows NT 6.0 對應作業系統 windows vista

  Windows NT 5.2 對應作業系統 windows 2003

  Windows NT 5.1 對應作業系統 windows xp

  Windows NT 5.0 對應作業系統 windows 2000

  Windows ME

  Windows 98

  加密等級標識

  N: 表示無安全加密

  I: 表示弱安全加密

  U: 表示強安全加密

  瀏覽器語言

  在首選項 > 常規 > 語言中指定的語言

  渲染引擎

  瀏覽器 使用 Presto 渲染引擎,格式為: Presto/版本號

  版本資訊

  顯示 瀏覽器 真實版本資訊,格式為: Version/版本號

 

二、User-Agent的歷史

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為了更好的理解上面的 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 字串,區別只是版本有所不同。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,所以採取了當初微軟 IEuser-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 為了與 WebKituser-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/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 版本總會保持同步。

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.50Mozilla/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 沒有一點用。為了瀏覽器的相容--這便是這個宣告的理由。

 

三、user-agent的作用

根據前面介紹的user-agent的歷史我們知道,通過user-agent不能完全準確的判斷是屬於那款瀏覽器。由於UA字串在每次瀏覽器HTTP 請求時傳送到伺服器,所以伺服器就可以根據它來做好多事。

比如:

1、統計使用者瀏覽器使用情況。有些瀏覽器說被多少人使用了,實際上就可以通過判斷每個IP的UA來確定這個IP是用什麼瀏覽器訪問的,以得到使用量的資料。

2、根據使用者使用瀏覽器的不同,顯示不同的排版從而為使用者提供更好的體驗。有些網站會根據這個來調整開啟網站的型別,如是手機的就開啟wap,顯示非手機的就開啟pc常規頁面。用手機訪問谷歌和電腦訪問是不一樣的,這些是谷歌根據訪問者的UA來判斷的。 

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

比如:偽裝 user agent 來回避某些偵測特定瀏覽器才能讀取的網站。

如果使用Firefox瀏覽器外掛User agent switcher,使用者就可以輕鬆地在不同UA之間切換,把自己偽裝成其他瀏覽器。這樣就可以在PC上預覽WAP或移動格式的網頁,比如專門為iPhone設計的頁面

 

四、獲得user-agent的值

既然已經知道user-agent是http的頭域,那我們在程式設計的時候就可以獲得它。

在 ASP.NET 中使用 Request.Header["User-Agent"] 得到瀏覽器的 User Agent,也可以使用 Request.UserAgent 來獲取;
Java 中使用 request.getHeader(”User-Agent”) 來獲得;
PHP 中相應使用:$_SERVER[HTTP_USER_AGENT];

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


轉載:https://blog.csdn.net/xinyuan_java/article/details/66092335

一、什麼是User-Agent

User-Agent是Http協議中的一部分,屬於頭域的組成部分,User Agent也簡稱UA。用較為普通的一點來說,是一種向訪問網站提供你所使用的瀏覽器型別、作業系統及版本、CPU 型別、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等資訊的標識。UA字串在每次瀏覽器 HTTP 請求時傳送到伺服器!

瀏覽器UA 字串的標準格式為: 瀏覽器標識 (作業系統標識; 加密等級標識; 瀏覽器語言) 渲染引擎標識 版本資訊

  作業系統標識

  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 對應作業系統 windows 7

  Windows NT 6.0 對應作業系統 windows vista

  Windows NT 5.2 對應作業系統 windows 2003

  Windows NT 5.1 對應作業系統 windows xp

  Windows NT 5.0 對應作業系統 windows 2000

  Windows ME

  Windows 98

  加密等級標識

  N: 表示無安全加密

  I: 表示弱安全加密

  U: 表示強安全加密

  瀏覽器語言

  在首選項 > 常規 > 語言中指定的語言

  渲染引擎

  瀏覽器 使用 Presto 渲染引擎,格式為: Presto/版本號

  版本資訊

  顯示 瀏覽器 真實版本資訊,格式為: Version/版本號

 

二、User-Agent的歷史

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為了更好的理解上面的 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 字串,區別只是版本有所不同。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,所以採取了當初微軟 IEuser-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 為了與 WebKituser-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/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 版本總會保持同步。

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.50Mozilla/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 沒有一點用。為了瀏覽器的相容--這便是這個宣告的理由。

 

三、user-agent的作用

根據前面介紹的user-agent的歷史我們知道,通過user-agent不能完全準確的判斷是屬於那款瀏覽器。由於UA字串在每次瀏覽器HTTP 請求時傳送到伺服器,所以伺服器就可以根據它來做好多事。

比如:

1、統計使用者瀏覽器使用情況。有些瀏覽器說被多少人使用了,實際上就可以通過判斷每個IP的UA來確定這個IP是用什麼瀏覽器訪問的,以得到使用量的資料。

2、根據使用者使用瀏覽器的不同,顯示不同的排版從而為使用者提供更好的體驗。有些網站會根據這個來調整開啟網站的型別,如是手機的就開啟wap,顯示非手機的就開啟pc常規頁面。用手機訪問谷歌和電腦訪問是不一樣的,這些是谷歌根據訪問者的UA來判斷的。 

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

比如:偽裝 user agent 來回避某些偵測特定瀏覽器才能讀取的網站。

如果使用Firefox瀏覽器外掛User agent switcher,使用者就可以輕鬆地在不同UA之間切換,把自己偽裝成其他瀏覽器。這樣就可以在PC上預覽WAP或移動格式的網頁,比如專門為iPhone設計的頁面

 

四、獲得user-agent的值

既然已經知道user-agent是http的頭域,那我們在程式設計的時候就可以獲得它。

在 ASP.NET 中使用 Request.Header["User-Agent"] 得到瀏覽器的 User Agent,也可以使用 Request.UserAgent 來獲取;
Java 中使用 request.getHeader(”User-Agent”) 來獲得;
PHP 中相應使用:$_SERVER[HTTP_USER_AGENT];

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