為什麼 Chrome 的 User-Agent 寫 Mozilla?一場 30 年的瀏覽器集體謊言

約 7 分鐘閱讀

更新日期:2026-04-12


⚡ 站長快讀:核心重點

  • 文章屬性:科技冷知識
  • 核心結論:你現在用的 Chrome 跟網站溝通時,會宣稱自己是「Mozilla/5.0 … AppleWebKit … (KHTML, like Gecko) … Safari/537.36 … Chrome/…」——整條字串幾乎每一段都是假的。這不是 Google 在惡搞,而是一段從 1995 年就開始的連環騙局,每一代新瀏覽器都得假扮上一代才能存活,最後變成今天這個「每個人都假裝是每個人」的爛攤子。
  • 適用對象:所有對網路歷史好奇的人、前端工程師、以及每次看到 User-Agent 字串就覺得哪裡怪怪的人

🔍 故事的起點

站長我先請你做一件事:打開你的 Chrome,按 F12 開啟開發者工具,切到 Console 分頁,輸入 navigator.userAgent,按 Enter。你會看到類似這樣的一串字:

為什麼 Chrome 的 User-Agent 寫 Mozilla?一場 30 年的瀏覽器集體謊言 3
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

停下來仔細看一下這串字:

  • 開頭寫 Mozilla —— 你用的是 Chrome,不是 Firefox,Mozilla 是 Firefox 背後的基金會
  • 中間寫 AppleWebKit —— 這是 Apple 的引擎沒錯,但 Chrome 現在用的是 Blink 引擎,不是 WebKit
  • 括號寫 KHTML, like Gecko —— KHTML 是 KDE Linux 桌面環境的古老瀏覽器引擎,Gecko 是 Firefox 的引擎,兩個跟 Chrome 一點關係都沒有
  • 最後寫 Safari —— 你不是在用 Safari

整條字串裡唯一沒說謊的只有 Chrome/120.0.0.0 那一小段。其他全是假的。更誇張的是 Edge 瀏覽器——它會再在最後加上 Edg/120.0.0.0,但前面那一長串 Mozilla、WebKit、Safari 也全都有,等於它同時宣稱自己是 Netscape、蘋果 WebKit、KDE 的 KHTML、Firefox 的 Gecko、Chrome、Safari、和 Edge——一個瀏覽器同時冒充七個身分

這不是單一廠商的問題,而是整個網路產業從 1995 年就集體陷進去的歷史包袱。

📌 一句話答案:所有現代瀏覽器的 User-Agent 字串都以「Mozilla」開頭,是因為 1995 年網景瀏覽器壟斷市場時,網站只認得開頭寫 Mozilla 的瀏覽器,後來的 IE、Firefox、Safari、Chrome、Edge 為了相容性只能一代一代接力謊稱自己是 Mozilla,最後變成今天全球共通的集體騙局。


🧪 原理拆解

第一幕:Mosaic 殺手誕生(1993–1994)

1993 年,全世界第一個普及的圖形介面瀏覽器叫做 NCSA Mosaic,由伊利諾大學的一組學生開發,其中包括 Marc Andreessen。Mosaic 的出現讓網路從純文字變成「有圖有真相」,是網路能變成大眾媒體的關鍵一步。

一年後,Marc Andreessen 離開伊利諾大學,創了一家公司,目標很簡單——做一個能幹掉 Mosaic 的瀏覽器。這家公司叫 Netscape,而他們給新瀏覽器取的內部代號非常有殺氣:Mozilla,取自「Mosaic + Godzilla」,直譯就是「Mosaic 哥吉拉」,意譯就是「Mosaic 殺手」。

1994 年底,Netscape Navigator 上市,支援 Mosaic 沒有的新功能,最關鍵的是框架(frames)——讓網頁可以分成多個區塊同時載入。它的 User-Agent 字串長這樣:

Mozilla/1.0 (Win3.1)

這個簡單的字串,就是日後所有瀏覽器字串的元祖。

第二幕:User-Agent 嗅探與第一場謊言(1995–1996)

Netscape 開始流行後,網站開發者面臨一個問題:Mosaic 不支援 frames,傳 frames 版網頁給它會直接爛掉。於是開發者想出一個土炮解法——User-Agent sniffing(使用者代理嗅探):

  • 收到 HTTP 請求時,先看對方的 User-Agent 字串開頭
  • 如果是 Mozilla/...,傳新版 frames 網頁
  • 其他一律傳舊版純文字網頁

這個解法看起來合理,直到第三個玩家登場

1995 年,Microsoft 推出 Internet Explorer,這是個技術上支援 frames的新瀏覽器。但問題來了:IE 不叫 Mozilla,所以當它連上那些搞 User-Agent 嗅探的網站時,會被當成舊版 Mosaic 對待,拿到的永遠是沒有 frames 的陽春版網頁。使用者看到只會覺得「IE 好爛,連 frames 都沒有」。

Microsoft 的工程師面對這個困境,做了一個影響往後 30 年的決定:假裝自己是 Mozilla

IE 的 User-Agent 字串變成:

Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)

翻譯:「我是 Mozilla 1.22,但其實我是 IE 2.0,跑在 Windows 95 上。」這是史上第一次有瀏覽器公然在 HTTP 標頭裡扯謊,而且成功了——網站的 sniffing 程式只看字串開頭,於是 IE 順利拿到 frames 版網頁。這場集體謊言的第一塊骨牌,就這樣被推倒了。

第三幕:謊言滾雪球(1998–2008)

從此之後,每一代新瀏覽器都得接力扯謊,理由都一樣——沒扯謊就拿不到網頁:

  • Firefox / Mozilla(2004):基於原本的 Netscape 程式碼重生,理所當然繼續用 Mozilla/5.0,但它也開始加入 Gecko 標示(Gecko 是 Firefox 的渲染引擎)
  • Safari / WebKit(2003):Apple 想讓 Safari 相容當時為 Firefox 寫的網頁,於是 Safari 的字串變成 Mozilla/5.0 ... AppleWebKit/... (KHTML, like Gecko) ...——它同時宣稱自己是 Mozilla、是 KHTML(被 WebKit fork 的原始專案),還「像 Gecko」(Firefox 的引擎)
  • Chrome(2008):Google 不想跟 Safari 的相容性打架,於是 Chrome 乾脆把 Safari 的整段字串照抄,再在最後加一段 Chrome/...。結果 Chrome 的字串變成「Mozilla + WebKit + KHTML + Gecko + Chrome + Safari」六層疊疊樂
  • Edge(2015):微軟的新瀏覽器一開始用自家引擎 EdgeHTML,本該有自己的字串,但為了相容性只能繼續疊,後來 2019 年 Edge 改用 Chromium 核心之後,字串變得跟 Chrome 幾乎一模一樣,只差最後多一個 Edg/...

今天你看到的那串超長 User-Agent,其實是一部 30 年的瀏覽器戰爭考古地層:最底層是 1995 年的 Mozilla,中間一層是 2003 年的 WebKit / KHTML,上面是 Gecko、Chrome、Safari、Edge……每一層都是某一代瀏覽器為了不被 sniffing 程式打回票而留下的疤痕。

第四幕:終於有人想收拾這個爛攤子(2020–至今)

2020 年之後,Google 發起了 User-Agent Reduction 計畫,打算慢慢縮短這條骨董字串。新的方向叫 Client Hints(Sec-CH-UA),設計上更乾淨:網站想知道什麼資訊就明確請求,瀏覽器按需提供,不再把所有歷史包袱一次丟過去。

舉例來說,Chrome 在 Client Hints 下對伺服器說的是這樣:

Sec-CH-UA: "Chromium";v="120", "Not A Brand";v="99"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"

乾淨俐落、一句謊話都沒有。但你要知道——這個新機制從 2020 年開始推,到 2026 年的今天還是沒有完全取代舊的 User-Agent 字串,因為全世界還有太多老網站在用舊的 sniffing 邏輯。要是 Chrome 真的把 Mozilla 那段拿掉,那些老網站立刻全掛。這條 30 年的謊言,至今還得繼續說下去。


💡 站長老實說:冷知識延伸

站長我第一次知道這件事是 2011 年左右,當時在做一個需要區分手機瀏覽器的小工具,翻 User-Agent 字串翻到一半突然發現「等等,為什麼 Android 手機的 Chrome 也要寫 Mozilla?」上網查了才發現這條連環謊言的始祖是 Netscape,從此我看 User-Agent 字串的眼光就不一樣了——那不是技術規格,那是一部口述歷史。

這個故事對站長我來說最有啟發的一點,是它說明了「相容性」這件事在軟體工程裡有多可怕。一個 1995 年某個網站開發者隨手寫的 sniffing 程式碼,影響了後面每一家瀏覽器廠商長達 30 年,沒有人敢第一個停止扯謊,因為誰先講真話誰先死。這種現象在軟體界有個專有名詞,叫做路徑依賴(path dependency)——你今天做的某個選擇,會在幾十年後變成後代工程師的枷鎖。

還有幾個延伸冷知識順便送你:

Mozilla 這個代號救了 Netscape 兩次。 第一次是 1994 年當成新瀏覽器的名字,第二次是 1998 年 Netscape 被微軟打垮、公司把原始碼開源,新成立的基金會需要一個名字,他們翻開公司檔案,決定繼續用 Mozilla。今天你用的 Firefox 就是這個基金會做的。一個原本叫「Mosaic 殺手」的代號,最後變成 Mosaic 早就作古之後還在用的品牌,這條命線真的夠長。

中國的 QQ 瀏覽器跟 360 瀏覽器也在扯同一套謊。 雖然它們內部用的是 Chromium 核心,User-Agent 字串一樣是「Mozilla/5.0 … AppleWebKit … Chrome … Safari …」然後在最後加 QQBrowser/...360SE/...。這條謊言不分國界,全世界沒有一個現代瀏覽器敢單獨站出來說真話。

你其實可以手動改 User-Agent。 Chrome、Firefox、Edge 都有開發者工具可以偽造 User-Agent,Safari 要到「開發 → 使用者代理」選單。偽造成「Googlebot」可以看到一些網站的 SEO 友善版面,偽造成 iPhone Safari 可以看到行動版網頁。但這不是破解,是利用了這整套系統設計上的原罪——既然字串本來就全是謊,你再加一個也沒差。

下次你在寫 Code 處理 User-Agent 的時候,記得先深呼吸。你面對的不是一串技術資訊,而是一部 30 年的瀏覽器戰爭史——每一個字元,都是某個工程師在某個深夜,為了讓自己的瀏覽器能被網站認得,而被迫留下的折衷妥協。


📎 參考資料來源