为什么所有浏览器的用户代理(User-Agent)都以“Mozilla/”开头?

简而言之:

  1. Mozilla 浏览器发布,其 User-Agent 为 Mozilla/1.0 (Win3.1)。该浏览器被公开更名为 Netscape,但在其 User-Agent 中仍保留了原名。
  2. Internet Explorer 发布。它通过在 User-Agent 中以 Mozilla/ 开头来冒充 Netscape,因为当时的网页服务器会常规性地进行浏览器检测,并仅向 Netscape 提供支持框架功能的页面(该功能同时被 Netscape 和 IE 支持,但其他同时代浏览器不支持)。
  3. 随着时间推移,Gecko、Konqueror、Opera、Safari 和 Chrome 各自决定通过伪造某些早期浏览器的 User-Agent,来操纵浏览器检测网页正确识别其浏览器功能。作为伪造的一部分,所有浏览器均以 Mozilla/ 开头,与之前的浏览器做法一致。此外还产生了许多其他混乱情况,例如现代Chrome的 User-Agent 同时声称自己是Mozilla、Chrome、Safari和“类似Gecko”。

图0:为什么所有浏览器的用户代理(User-Agent)都以“Mozilla/”开头?最初,有NCSA Mosaic,Mosaic自称为_NCSA_Mosaic/2.0 (Windows 3.1)_,Mosaic能够同时显示图片和文本,人们为此欢欣鼓舞。

图1:为什么所有浏览器的用户代理(User-Agent)都以“Mozilla/”开头? 随后,一款名为“Mozilla”的新网页浏览器问世,其名称是“Mosaic Killer”的缩写,但Mosaic对此并不满意,因此公共名称被改为Netscape,Netscape自称为Mozilla/1.0 (Win3.1),人们再次欢欣鼓舞。Netscape支持框架,框架在人们中流行起来,但Mosaic不支持框架,于是出现了“用户代理检测”,向“Mozilla”的网页管理员发送框架,而向其他浏览器则不发送框架。

元素周期表Netscape说,让我们嘲笑微软,将Windows称为“调试不佳的设备驱动程序”,微软很生气。于是微软开发了自己的网页浏览器,命名为Internet Explorer,希望它能成为“Netscape杀手”。图2:为什么所有浏览器的用户代理(User-Agent)都以“Mozilla/”开头?Internet Explorer支持框架,但它不是Mozilla,因此未被发送框架。微软变得不耐烦,不愿等待网页管理员了解IE并开始向其发送框架,于是Internet Explorer声称自己“与Mozilla兼容”,开始模仿网景,并自称Mozilla/1.22 (compatible; MSIE 2.0; Windows 95),Internet Explorer获得了框架支持,微软上下皆大欢喜,但网页管理员却感到困惑。

微软将IE与Windows捆绑销售,使其优于Netscape,第一场浏览器大战在地球上爆发。 图3:为什么所有浏览器的用户代理(User-Agent)都以“Mozilla/”开头? 随后,Mozilla演变为Firefox,并自称为Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0,而Firefox非常出色。Gecko开始繁衍,其他浏览器也诞生了,它们使用了Gecko的代码,并自称为Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/0.8.1,以及Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.8) Gecko/20071008 SeaMonkey/1.0 另一个,每个都声称自己是 Mozilla,而它们全都由 Gecko 驱动。

Gecko很好,而IE不好,嗅探技术重新出现,Gecko获得了良好的网页代码,而其他浏览器没有。 图4:为什么所有浏览器的用户代理(User-Agent)都以“Mozilla/”开头? Linux的追随者们感到非常悲伤,因为他们开发了Konqueror,其引擎是KHTML,他们认为它与Gecko一样优秀,但它不是Gecko,因此没有获得优质网页,于是Konqueror开始伪装成“类似Gecko”以获取优质网页,并自称Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko),这引起了很大的混乱。

图5:为什么所有浏览器的用户代理(User-Agent)都以“Mozilla/”开头?随后,Opera出现并说道:“我们应该让用户决定我们应该伪装成哪个浏览器,”于是Opera创建了一个菜单项,Opera自称Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1;en)Opera 9.51,或Mozilla/5.0 (Windows NT 6.0;U;en;rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51,或Opera/9.51 (Windows NT 5.1; U; en) 具体取决于用户选择的选项。

图6:为什么所有浏览器的用户代理(User-Agent)都以“Mozilla/”开头? 苹果公司开发了Safari浏览器,使用了KHTML内核,但添加了大量新功能,并分叉了该项目,将其命名为WebKit。然而,苹果希望网页能兼容KHTML,因此Safari自称Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5,情况变得更糟。

微软对 Firefox 感到极度担忧,Internet Explorer 重新回归,并自称 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0),它能正确渲染代码,但仅在网站管理员明确要求时才如此。

图7:为什么所有浏览器的用户代理(User-Agent)都以“Mozilla/”开头?随后谷歌开发了Chrome,Chrome使用WebKit引擎,与Safari相似,并希望网页针对Safari进行优化,因此伪装成Safari。因此,Chrome 使用 WebKit,并伪装成 Safari,而 WebKit 伪装成 KHTML,KHTML 伪装成 Gecko,所有浏览器都伪装成 Mozilla,而 Chrome 则自称 Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13,用户代理字符串变得一团糟,几乎毫无用处,每个人都假装成其他人,混乱至极。

共有 232 条讨论

  1. Mozilla 应该开始对以 Mozilla/ 开头的User-Agent收取许可费。资金问题解决!

    1. 从某种意义上说,这似乎是典型的商标侵权行为,欺骗人们(或他们的服务器)认为你的产品是别人的。我不知道现在是否还有关于此类问题的实际协议。

      1. 该标识在此使用中长期未受保护,我怀疑此类主张难以成功。

        此外,我怀疑欺骗服务器行为难以构成对商标的消费者混淆。

        1. 没错,但该裁决被驳回后形成的判例法,可能对需要在API命名中维护商标使用权的其他主体具有参考价值。此处的“API”指的是广泛的司法术语,其中User-Agent标头属于该范畴。

      2. 参见Sega v. Accolade一案,该先例表明此类做法很可能行不通。

      3. 对抗性兼容性还是挺不错的,我认为我们不应放弃它。

      1. 在您提供的页面最后一条评论中,有更详细的解释。

        我记得Netscape曾在其README或INSTALL文件(或类似“关于”的菜单项)中注明,浏览器的名称发音为Mozilla,但拼写为N-E-T-S-C-A-P-E。

    2. 也许这样人们就会停止发送这个标头。为了避免支付许可费。

      我已经省略它几十年了,效果很好。

    3. 谷歌将不得不支付大量许可费……

      > Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36

      它是Mozilla(不),Linux(是的,某种程度上),Android(是的),AppleWebKit(不是苹果也不是WebKit),KHTML(不),Gecko(不),Chrome(是的),移动(是的),Safari(不)。

      所以也许他们欠Mozilla、苹果和KDE一些东西。

      1. 公平地说,Blink 引擎最初是基于 Apple 的 WebKit 引擎分支开发的。虽然我不会惊讶于现在 Chromium 中可能没有 WebKit 的代码……

        1. 说到公平,苹果的WebKit最初也是从KHTML分支出来的。所以这条字符串是有道理的。

  2. 并非所有浏览器(例如“Lynx/2.9.0dev.12 libwww-FM/2.1”) 🙂

    1. 所有重度 Lynx 用户都知道,对于那些声称无法与 Lynx 兼容的怪异网站,可以临时将浏览器切换为 Mozilla。我很高兴这种情况随着时间的推移越来越少。

    2. 别忘了SpaceGoat/2000,这是我构建浏览器类功能时的首选工具。我从2000年前就开始使用它,或许是时候升级到SuperSpaceGoat/2100了?

    1. 我的个人推测是,他们希望无限期地停留在下一版本,但Mac OS似乎无限期地停留在版本10,他们不能落后于Mac OS。有趣的是,就在Mac OS升级到版本11后不久,Windows 11就被宣布了。

      (不过从现实角度来看,‘9x’问题确实很有道理)

    2. 另一个无需过度推测的替代原因在于,微软已拥有两款以“Windows 9”开头的產品,而用户(无论是最终用户还是更新目录的人员)很可能因此产生混淆。

    3. TL;DR:部分代码在搜索Windows 95或98时,仅通过“Windows 9”这一关键词匹配两者,因此会将Windows 9也纳入其中。

      如今苹果在操作系统版本中加入年份,几年后人们可能会好奇iOS 19-25去哪儿了。

        1. 我曾参与修复过包含此漏洞的代码库,因此不确定你为何认为“这是错误的”。

          我们销售的软件会在客户现场长期部署,客户不会主动更新,因此即使我们已修复漏洞,该问题仍在生产环境中持续存在。

          1. 据我所知,只有库会生成此类字符串,这些字符串也可能在 Windows 9 上报告不同的内容。实际上,Windows API 甚至会在应用程序未针对 Windows 10 及更高版本进行声明时,返回 Windows 8 的版本信息。

            1. 我于2008年加入的公司在2005年左右曾销售过存在该漏洞的软件,而客户在2015年Windows 10发布时仍在使用该软件。

              认为“设计合理的软件不会出现此类问题,因此该问题不存在”的观点,与我职业生涯中见过的几乎所有情况都相悖。

      1. 公共名称与内部名称无需一致。他们可以将其命名为Windows 9,并在API中内部报告为任何名称。

        在软件开发中,当实际名称在最后阶段才确定或频繁更改时,这样做是标准做法,这样就无需更新所有代码来引用新名称。

        1. > 公共名称与内部名称无需一致。他们可以将其命名为Windows 9,并在API中内部报告为任何名称。

          当时他们就是这么做的。

          Windows 7 是 6.1,Windows 8 是 6.2,Windows 8.1 是 6.3。

          1. 时至今日,例如 Windows 11 的版本号仍是 10.0.26100

        2. 问题在于90年代的应用程序。

          这些应用程序质量非常差。它们很可能只是使用了返回面向消费者的名称的API。

          这些是运行在特定计算机上的定制应用程序,例如银行、商店、政府机构等全球各地的场所。

        3. 这是苹果在最终放弃OS X品牌时所做的。macOS 15也报告为10.15。

  3. 有人尝试过在标准现代浏览器上运行一个通用User-Agent吗?(所谓“通用”,是指完全放弃这种兼容性调整。)我很好奇这样会导致多少功能失效或性能下降。

    1. 我曾尝试让我的网页浏览器声称自己是Google蜘蛛。它运行良好,我完全忘记了这件事,直到一两年后某个网站因我冒充Google蜘蛛而对我实施软封禁。我联系他们投诉。他们解除了封禁并告知封禁原因,这让我记起了那个从未终止的实验。

    2. Opera Presto并未使用该功能,其User-Agent类似于:

        Opera/9.80 (X11; Linux zvav; U; en) Presto/2.12.423 Version/12.16
      

      似乎并未引发太多问题。

      它一直保持版本为9.80,可能是因为版本≥10在某个地方引发了问题。

      1. 天啊,我好想念Presto……但即使在Opera还很流行的时候,它也存在严重的兼容性问题。

    3. 不幸的是,所有进行指纹识别/“机器人检测”的功能都会被触发。

      1. 如今,所有隐私相关功能都会直接破坏互联网。尝试使用VPN时,CDN有半数时间会直接拒绝提供JS文件,导致超市或机票预订网站加载失败或显示通用禁止错误。

        屏蔽User-Agent必须由苹果、谷歌或微软推动。在这三者中,我认为只有苹果会这么做。iCloud 私人中继不会破坏网站,因为公司关心不降低苹果用户的体验,并确保网站仍能正常工作。

    4. 我在2010年代初尝试过这样做。即使在那时也不起作用(例如GitHub就崩溃了)。如果你今天这样做,很可能会被许多主要网站因“伪造”User-Agent而封锁。Cloudflare的转发器将停止工作,你会被大量验证码困扰,等等。

      即使Tor浏览器也不敢对User-Agent字符串进行重大修改。因为追踪器实际上并不关心你的User-Agent。它们是通过侧信道(如 canvas、WebGL、字体等)来识别你的设备/操作系统。

      1. 关于 Tor 浏览器,不是它们不敢修改,而是它们不想修改。该浏览器的一个目标就是不引起过多注意,而修改User-Agent恰恰会做到这一点,所以它们不这么做。

        1. 那么理想的情况是将User-Agent字符串标准化,使其在每个平台上看起来相同。我的观点是:他们无法做到这一点。例如,一台Linux机器自称是Windows系统会立即被发现。相反,他们不得不通过根据你的设备/操作系统/架构对你进行分组来减少熵。

          1. 我认为这没有意义。以Tor浏览器为例,他们正是利用User-Agent来融入环境,因此他们并非解决User-Agent问题的好选择。

            正是当前的行业巨头有能力带来积极变革:谷歌和苹果。若其中任何一家对User-Agent的呈现方式进行重大调整,网站将迅速做出适应(如果确实需要的话……),否则便不会有任何变化。否则,变革将不会发生——而我认为这种情况会发生,与HTTP“Referer”(“referrer”的拼写错误)的情况如出一辙。

            有趣的是,非浏览器应用的用户字符串实际上要优雅得多。我运营一个互联网电台,有很多客户端类似于

            Linux UPnP/1.0 Sonos/85.0-64200 (ZPS1) Nullsoft Winamp3 版本 3.0(兼容)

            Echo/1.0(APNG)

            NSPlayer/8.0.0.3801

            mpg123/1.20.1

            1. >对于Tor浏览器而言,它们使用User-Agent字符串来融入环境,因此它们并非解决User-Agent字符串愚蠢问题的合适对象。

              不。他们并不使用User-Agent来混入其中。如果他们想混入其中,他们会修改每个平台的User-Agent字符串,使其看起来像 Windows x86_64 之类。他们不这样做,因为他们不可能逃脱惩罚。

              相反,他们只能通过屏蔽浏览器的次要版本号来减少熵。

              >有趣的是,非浏览器实际上拥有更优雅的用户字符串。我运营一个互联网电台,有很多类似的客户端

              而这些工具会因缺乏浏览器User-Agent字符串、缺乏浏览器式的 TLS 握手等原因被各种 CDN 阻断。这就是为什么需要创建 curl-impersonate 和 Go 语言的 utls 项目。

              1. >他们不这么做是因为他们根本无法逃脱。

                确实如此。他们这样做是为了融入其中。他们想要的是不引人注目,所以他们像其他浏览器一样行事。

                就像你提到的工具,curl-impersonate和其他工具。

                勇气和胆量,只有市场领导者才能做到。谷歌和Safari。其他人只是跟风。

  4. 有趣的是,UserAgents如今只用于两种情况:A – 伪装成浏览器,B – 恶意行为者交换解密信息

    为什么我们还没有废弃这个垃圾

  5. 讽刺的是,Cloudflare 阻断了这款基于 Mozilla 的浏览器在 Linux 手机上的访问,因此我无法再访问 SO。(Turnstile 很久以前就已损坏,半年前终于修复。现在我注意到它甚至不再显示,只出现一条静态提示,让我扔掉手机^W^W^W^W 升级浏览器。不清楚是 Cloudflare 还是 SO 导致的。)

    1. 毫不意外,CF与大型浏览器公司勾结。虽然有绕过方法,但在此不详细说明,因为“墙外有耳”;总之,那些“机器人”爬虫公司仍能轻松绕过限制。

  6. 原因非常奇怪且复杂。更好的问题是为什么它从未被修复/重命名为正确名称。

    1. > 更好的问题是为什么它从未被修复/重命名为正确名称。

      因为它之所以是现在这样,是因为要兼容那些本就设计错误的网站,这使得让它们改变变得非常困难。

      问题在于,设计不良的系统会根据User-Agent白名单限制访问或禁用功能,而这从来都不是正确的做法。没有正确的方法来做这件事,因为它总是错误的,但人们还是选择这样做。

      我个人倾向于将故障网站视为故障,但现实是任何“替代”浏览器都必须兼容为前代技术设计的故障网站,否则大多数普通用户不会考虑切换。

      如果我能成为互联网之王一天,并能强制实施任何我想要的更改,所有主要浏览器都必须在同一天将User-Agent字符串更改为完全独特的值,故意让所有错误设计的网站无法访问,迫使这些网站修复自己的问题。这可能是在“所有互联网服务提供商必须根据RFC 6177提供一个全球可路由的IPv6地址块,仅提供CGN IPv4地址是严重违规行为”之后的第二或第三项法令。

      1. 个人而言,我会完全取消User-Agent。停止发送User-Agent,让网站查询可用功能而非检查具体浏览器版本。

        1. 在处理旧版但流行版本的漏洞时,确实有必要知道具体的User-Agent,这就是为什么我说基于User-Agent的白名单来控制访问或高级功能是糟糕的。这必然会破坏任何未明确批准的新平台,显然这是不好的。拒绝访问或仅对已知有问题的版本应用修复是可行的。

          此外,我认为作为管理员,了解用户使用的客户端是有用的,但我理解许多人更希望限制与访问网站共享的数据。

          1. 滥用User-Agent进行跟踪和不合理地阻止浏览器——仅支持Chrome的网页在伪造User-Agent时仍能正常运行——其弊端远大于能够绕过浏览器特定漏洞的优势。

            如今,对于大多数公司而言,旧版浏览器已成过去式。IE已彻底消亡,几乎所有用户现在都使用自动更新的浏览器。

            网站不应试图适应浏览器,只需检测可用功能,若遇到罕见浏览器漏洞,可等待其修复(若影响主流浏览器)。

      2. 当我的网站显示“最佳浏览效果需使用Netscape”时,指的是Netscape Navigator。尽管世界已向前发展,但静态HTML 3.2与blink标签将永存。

        1. 这证明了我的观点,User-Agent允许列表只会让它在Netscape上工作,而blink标签在Firefox v23之前及其衍生版本中都支持,以及在Opera v15之前(之后它切换到Blink并成为另一个Chromium衍生版本)。只要你的HTML代码不是完全依赖于与Netscape的精确兼容性,它应该能在各种浏览器上正常工作。

          1. 我曾与IT部门就遵循标准编码展开过多次争论。他们说,我们遵循标准,我们的标准是IE 6。

            他们为这个决定付出了沉重的代价。

    2. 为了避免破坏现有功能,与其说服每个进行奇怪User-Agent解析的网站自行修复,不如使用丑陋的User-Agent字符串更简单。

      唯一例外是Opera在使用自有引擎的时期,其默认User-Agent字符串开头确实包含“Opera”。但到了版本10时,他们不得不将主要版本号改为9,并在字符串后半部分添加真实版本号,因为网站无法处理两位数的版本号……

      1. 我怀念Opera。它被管理得如此糟糕,最终被卖给投资者,这真是太可惜了,这进一步使其陷入无关紧要的境地。它现在靠游戏导向的噱头和可疑的促销活动勉强维持。我听说Vivaldi是它的延续,但从我看到的情况来看,它只是另一个基于Chromium的克隆版本,拥有闭源的用户界面,没有任何独特的功能。

        90年代末/21世纪初的Opera非常出色。它轻便且响应迅速。是首批支持标签页的浏览器之一。Presto引擎在当时的机器上性能最佳。试用版/广告软件虽然令人烦躁,但浏览器本身非常稳定。内置的邮件客户端也相当不错。

        2009年,他们推出了一个非常有趣的网页服务器/共享功能——Opera Unite,可惜未能获得广泛采用。

        Opera Mini在智能手机普及前也曾是最好的移动浏览器之一。

        1. >真是可惜,它被管理得如此糟糕

          我认为即使是世界上最好的管理团队,也无法帮助它抵挡谷歌Chrome的冲击及其庞大的资金优势。这就像一支女童子军队伍对抗NBA球队。

        2. 阿门,兄弟。

          我个人最看重的是能够“最小化”/取消选中标签页的功能,这是早期标签页版本的遗留特性,当时标签页的概念基本上是基于Windows任务栏(和MDI)而非真正的标签页。我不是火狐用户,因为它只是最不糟糕的选择,而且曾经有火狐扩展程序基本上(但不完全)实现了这一功能,但Mozilla自然破坏了它,因为他们认为让火狐变得更糟糕会让它更受欢迎[1])。

          还有鼠标手势。同样,你可以用火狐勉强实现,但像主页快捷方式屏幕这样的随机功能现在不支持它,因为???

          另外,我想要一个状态栏。我不在乎它是否过时,但我想要一个。

          抱歉如果这变成了一场针对Mozilla/Firefox的抱怨大会。

          [1] 我不认为Opera有漂亮的RSS订阅预览视图,但Firefox有。然后他们因为随机原因破坏了它?天啊,原始XML比一个合理的视图好得多,谢谢Mozilla!

    3. 可能吧,但这并非首次有人将本应是原始名称的字段改造成完全不同的内容。

      在PC兼容世界中,磁盘卷的卷启动记录(Volume Boot Record)中有一个字段,本应是格式化该卷的OEM厂商名称。它(至今仍是)几字节的人类可读标识文本。操作系统最终开始进行字符串比较和解析数字,并以奇怪的方式出现故障,包括甚至无法识别自己的作品,当操作系统供应商未使用首个供应商的名称时。

      * https://jdebp.uk/FGA/volume-boot-block-oem-name-field.html

      自MS-DOS 3.3和浏览器战争以来,时间可能已经足够长,以至于有人正在犯同样的错误,再次忽视历史教训。

    4. 可能是因为现在如果你使用不同的User-Agent,可能会被WAF或负载均衡器拦截。历史太过复杂,不可能一夕之间就忘记。

  7. 也许我们应该改用类似termcap的方案来处理浏览器?/s

  8. 它更胜一筹…

    Chrome表现良好,而MSIE表现不佳,因此网站管理员向MSIE提供劣质页面。微软对此不满。于是他们创建了Edge。Edge表现良好,但微软担心网站管理员会将其视为MSIE。因此微软Edge伪装成Chrome以获取优质页面。

    Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0

    1. 我总觉得这些时间线遗漏了一个时代。那个时代,网景浏览器停滞不前,而微软推出了一款更优越、免费且不遵守标准的浏览器,实际上推动了HTML/JS的演进。IE 4.0至IE 6.0基本上开创了后来成为HTML 4的特性。例如:动态修改DOM和XML异步请求。

      IE 基本上开启了真正动态网站的时代。当然,IE 6 后来变得糟糕(最终),从而开始了 IE 停滞的时代。微软获得了他们想要的市场份额,然后基本上在接下来的十年里无所作为(而其他浏览器开始再次创新,W3C 也开始行动)。

      尽管你可以随意批评 IE,但曾有一段被遗忘的时期,它曾是先驱。

      此外,在使用 Edge 浏览器一个月左右后,我发现其在 Android 上的体验比 Chrome 更好。但在 Windows 桌面上,我仍更倾向于使用 Chrome 而不是 Edge。

      显然,个人体验可能因人而异,但这些是我个人的观察和体验。

      1. Netscape Navigator早在Internet Explorer使innerHTML属性可变之前就已支持层(https://en.wikipedia.org/wiki/Layer_element)。与层不同,IE的innerHTML无法用于动态更新,因为它像筛子一样泄漏内存,且在动态重新加载内容几次后,IE会彻底卡死。[1]

        层功能败下阵来,innerHTML 胜出,但说 IE 比 Netscape 更具创新性未免牵强。可以说 innerHTML 胜出是因为当时微软正利用其垄断地位大力推广 IE 并打压 Netscape。

        [1]人们正在使用 JavaScript 和 Navigator 4 的层技术构建令人惊叹的 DHTML 游戏。IE 4 的 innerHTML 看起来更强大,但实际上完全无法使用。以 DHTML 游戏为模板,我为 Navigator(层)和 IE(innerHTML)构建了一个无需重新加载页面的考勤表输入和管理应用程序。这大约是在 2001 年初。在 Navigator 中,你可以一整天都重新加载工时表;而在 IE 中,应用程序在经过几次工时表更改后就变得无法使用。IE 4 统治市场的时间如此之长,以至于事实上,直到多年后才能够构建真正的动态网络应用程序。从我的角度来看,IE 推迟了现代网络的出现。

        1. 查看维基百科,我看到IE 6于2001年发布,所以我可能记错了某些背景。但我清楚记得,我在9·11事件后不久就离开了那份工作,而且我确信当时我们必须支持的IE版本无法用于严肃的DHTML开发。

          1. Windows 只有 IE4 和 IE6。Mac 有一款很棒的 IE5 版本(真的)。

            但如果使用 XMLHttpRequest 或 innerHTML 过多,IE 就会崩溃。因此,尽管他们从 IE4 开始就强行推广 IE,但直到后来 IE6 版本(Windows 服务包万岁)才变得可用,时间上稍晚于 2001 年。

      2. 情况比这更复杂:实际上,Netscape 才是那个不遵守标准的浏览器(尤其是拒绝实现 CSS),而微软的 IE 则以 W3C 当时某位成员所称的“白骑士”身份出现,推出了一款重视标准的浏览器,并发布了其 DTD,真正实现了 CSS 等功能。他们(当然)遇到了典型的微软问题:“我们实现了草案,然后他们进行了重大更改(涉及盒模型,讽刺的是后来为其添加了配置标志,许多人主动选择旧的微软方式; P),且由于已有用户基础,无法很好地进行更新”,但我认为真正导致他们停滞不前的,是针对他们的巨额诉讼,这在一家不强迫员工参与他们不愿参与的项目团队的公司中,严重打击了IE团队的士气(微软的文化是“如果你想开发新产品,就从其他更无聊的团队中挖走一整个团队的人”)。

        如需更多信息和大量参考资料,以下是我五年前留下的详细评论:

        https://news.ycombinator.com/item?id=5718968

      3. 我認為微軟停滯不前的原因與網景(Netscape)相同:他們的代碼庫不夠靈活,無法很好地實現新功能。

        放棄如此大規模的代碼庫是一個重大決策,因此瀏覽器開發者通常會拖延到停滯不前時才採取行動。

        这在网景上发生过,在MSIE上发生过,在Opera上发生过,在Firefox上发生过,你能猜到下一个会是谁吗?

        1. Presto和Mariner的代码库被放弃了(除了NSPR、SpiderMonkey和NSS部分)。

          IE和Firefox的代码库并未被放弃。在两种情况下,都是对允许重大更改的遗留扩展进行了放弃,但Edge和Quantum都不是新的代码库。

          (WebKit在Mac上废弃了其第一个嵌入式API,并在Linux上将其替换为WebKit2 API。)

      4. > IE基本上开启了真正动态网站的时代。

        我认为这是一种劣势,而非优势:正是它摧毁了网络作为文档查看平台的地位,将其转变为我们今天所见的现代隐私破坏型、JavaScript泛滥的应用程序部署平台。每次看到模糊的图像,每次不得不启用脚本才能查看文本和图像——我都可以怪罪IE。

        > 此外,我发现Android上的Edge比Android上的Chrome体验更好

        Android上的Firefox也很酷,而且是开源软件。

      5. 我不了解Edge,但你对IE4、IE5时代的描述非常准确。至少你写的内容与我对那段时期的记忆非常吻合:就连公开支持Netscape的人也秘密使用IE 5。

        另一方面,这篇文章是关于User-Agent字符串的,本就不是为了准确记录浏览器发展时间线。

        例如,文中提到:

        “Linux的追随者们感到非常悲伤,因为他们开发了Konqueror,其引擎是KHTML [..]

        随后Opera出现并表示,‘我们应该让用户决定浏览器应模拟哪个浏览器,[..]’”

        如果我记得没错,Opera的出现时间早于Konqueror和KHTML。

      6. 微软在应用程序的自动化脚本和向程序员开放应用程序组件方面,有着深厚的技术积累。VBA、DDE、COM。这在浏览器领域确实算得上创新,也是他们一直以来所做事情的自然延伸。

      7. 在 Android 和 Windows 上,我发现 Firefox 比两者都更好。Android 上的 Firefox 扩展特别有用。

        Android 上的 Firefox 存在滚动帧率不总是 60fps 的问题,用户体验并不理想,但在我看来,拥有 uBlock Origin 和 Stylus 在 Android 上要好得多。

    2. 我怀疑情况并非如此。微软知道IE已经过时且存在问题,但由于太多人依赖其现有实现,他们无法继续推进,只能在失去浏览器市场份额前进行重置。

      他们当然不希望Edge看起来像IE那样糟糕,

      if(browserType === ‘IE’) doIEWorkAround() else doNormalThings()

      所以我理解他们的掩饰。

  9. 而艾伦·凯早已预见到了这一点,并说道:“这简直是石器时代的胡说八道。我们在帕洛阿尔托研究中心(PARC)已经做得更好。”与其将糟糕的文本文件发送给渲染引擎让它们自行解析,我们应该发送对象。每个对象都应拥有一个URL,用户应与这些对象进行交互。他与大卫·A·史密斯及其他六人合作,最终实现了这一构想……该系统包含2D对象,还具备3D虚拟现实功能,不同服务器上的对象可相互交互,所有人都认为这酷毙了,但最终一无所成,因为世界具有路径依赖性,网络效应至上。

    http://wiki.c2.com/?OpenCroquet

    https://en.wikipedia.org/wiki/Croquet_Project

    https://www.youtube.com/watch?v=XMk9IGwuRmU

    简而言之:未来早已到来,但它无法与现在沟通。

    1. > 3D虚拟现实

      3D拟物化界面在理论上一直很好。我认为它们的问题在于键盘。鼠标能够记录速度(这就是为什么它用于瞄准),而键盘是二进制的。这种区别对于快速浏览界面至关重要。如果我想切换应用程序或标签,我通常可以快速移动鼠标来完成。在3D环境中,我必须走到新任务所在的位置,这可能需要相当长的时间,具体取决于它离我有多远。

      没有人愿意探索一个100层的虚拟商场,当他们可以直接输入他们想要的东西时。这可能对宜家有效,但这种模式能奏效的市场极其小众。

      计算机的优势在于它们不需要像现实世界那样运作。我确信我们当前对VR界面的设计(即3D拟物化风格)是一条死胡同;一定存在一种与现实完全不同的更高效方法。

      无论如何,2D浏览器才是更好的选择。酷炫并不等于易用。

      1. 在许多情况下,酷炫比速度更重要。任何基于娱乐的内容,甚至社交媒体都是如此。3D界面在沉浸感和互动性方面难以匹敌。一旦有人沉迷于3D(例如第一人称射击游戏),就再也回不去了。

        1. 正确!但你实际上是在追求酷炫或娱乐性。否则你只是想完成任务并继续前进,这种情况下速度>酷炫。

          当然会有例外,但通常规则适用。

    2. 虽然很酷,但我不确定3D界面是否曾是维基的未来。谢天谢地。

      1. 那只是一个阶段。

        当时有VRML,有《第二人生》,Linux系统有个3D立方体,每个面都是虚拟屏幕。大家都读过《雪崩》。

        就像虚拟现实似乎就在眼前,那也是第一次数字货币热潮的时代:Liberty Reserve、E-gold、DigiCash、Flooz。事物在变化,但有些东西永远不变。

        1. Compiz Cube酷毙了,没人能说服我改变主意。我曾将其配置为根据窗口最近获得焦点的顺序在3D空间中分层排列,还通过cron、curl和几个Compiz插件让桌面根据实际天气下雪或下雨,并设置热键来调整透明度、切换始终置顶或在眼睛疲劳时反转颜色——天啊,我多么怀念那个时代。

          和大家一样,我现在使用 macOS,因为这是工作所需,而桌面几乎无法使用,原始得令人发指。每天我都气得要命,因为无法随心所欲地调整透明度或切换始终置顶模式。

          1. 你说得对。我喜欢那个立方体,还有其他真正有效的自定义功能,但我们为了可靠性、一致性和其他吸引人的东西,放弃了它们。但那个时代充满希望,至今仍让人困惑的是,事情没有沿着那条路继续发展。

          2. 我12岁时,有很多人因为展示Compiz特效而转投Linux。不知何故,这些特效在性能糟糕的Pentium III处理器上运行得异常流畅。

        2. 你提到的正好,我今天刚遇到VRML。在AGI32(一款糟糕的灯光模拟软件)中,如果你在渲染视图中点击导出,它默认提供的就是VRML格式。

        3. 世事变迁,本质不变。当XML成为主流时,VRML重新包装为XML格式,而如今Web3D在HTML5时代以相同技术重新诞生。

          1. VRML描述了3D物体的顶点和边,但其功能远不及OpenGL或WebGL强大。借助顶点着色器和片段着色器,OpenGL在生成图像方面的能力几乎没有限制。我从未听说过VRML有类似的功能。

            事实上,我敢打赌,一个VRML渲染器可以纯粹用JS + WebGL实现。

          2. VRML是声明式的。它就像用于描述3D场景而非文档的HTML。

            Web3D(具体指WebGL)是命令式的。它允许程序通过告诉系统在每帧中将三角形放置在哪里来渲染3D场景。

    3. 我喜欢“发送糟糕的文本文件”作为我们的(集体)工作描述。

    4. 它看起来“很酷”,有一种2000年代初的感觉,但看完视频后,它似乎并没有解决任何新问题,除了可能在一定程度上提升了协作效率。我认为,新的平台/操作系统需要具备一个杀手级、差异化的功能,使其脱颖而出,并以比前代产品高出一个数量级的效率解决实际问题。此外,这个功能必须面向普通用户,而非程序员。真正的用户并不关心(甚至不知道)你的整个平台是否基于糟糕的文本文件,或是可寻址的面向对象的“独角兽”。

      1. 用现代术语来说,想象一个Croquet世界就像一个点对点的3D Slack频道,任何人都可以像创建网页一样轻松地托管它。它使用TeaTime和两阶段提交进行低延迟同步,使其成为一种分布式实时数据库。它分发的是对象和事件,因此也可以将其视为以太坊合约,其中成员的虚拟机共同构成执行引擎。

        Croquet当时和现在都远远领先于时代。可能要等到50或100年后,人们才会意识到其潜力,届时Croquet本身很可能已被完全遗忘 🙁

    5. 我认为那些说这很酷但不实用的人过于关注克罗凯特的3D方面。

      你真正应该考虑的是,一切都是通过对象来实现的,因此,你无需将JSON作为一种RPC协议使用,而是可以通过浏览器直接获取所有对象。你无需共享电脑屏幕,而是可以共享电子表格的一页、一个游戏或你的文件系统。你无需在浏览器上构建这些轻量级客户端,而是可以通过这样的系统直接共享你的软件。

      1. “对象”在实际中意味着什么?

        JSON本质上是序列化的对象。X也可以通过网络共享窗口,但由于其设计目的仅限于此,因此在其他许多方面都存在缺陷。

        1. 想象一个无法自行绘制的对象,例如一个电子表格对象,它可以在某个窗口管理器中自行绘制,你通过方法调用等更新它,并希望通过网络共享。将该对象序列化并通过网络传输与在屏幕上绘制它,然后使用某种 JSON 传输数据并在浏览器中通过瘦客户端重建电子表格,两者有何区别?

          我的意思是,差异很微妙,你可以说为什么我们不使用相同的绘制引擎,而是通过 JSON 传输数据?你需要解决同步等问题,但如果你使用类似 Croquet 的系统(我在此假设,我没有使用过该系统),你共享的是对象本身、方法以及整个对象,而不仅仅是它的文本表示。

          1. 这难道不意味着在他人计算机上执行任意代码吗?你可以通过网络发送一个JavaScript对象而非JSON数据,然后在客户端代码中将其与之结合(这是谷歌在搜索建议功能中曾采用的方法)。

  10. 这很有趣,因为在每个阶段,每个参与者都采取了局部最优的步骤——网站管理员希望为用户提供可正常运行的页面,而新的浏览器供应商希望用户能够获得支持所有功能的页面。

    然而,最终我们却陷入了对所有人来说都是一团糟的局面。有什么不同的做法能让我们得到一个好的解决方案吗?我猜,如果能有普遍定义并遵守的标准,那么浏览器就可以简单地说“我支持HTML 1.3”。

    1. >有什么不同的做法能让我们得到一个好的解决方案吗?

      简单来说,从一开始就不应该有User-Agent。

      理想情况下,一个URI应该始终返回相同的网页。然而,为了能够更新网页,这一假设被打破了,最终对某种认证会话的需求催生了各种机制,这些机制最终彻底摧毁了URI作为统一资源标识符的地位。

      或许如果我们重新设计,会采用统一的认证方法,甚至可能支持引用页面过去的版本。可惜这并未实现。

      1. 这完全是美好的愿望,但我希望能够利用30年的经验重新设计网络。

        很快,我们只需执行WebAssembly代码块,事情就这么定了。

        1. 你今天仍然可以通过简化代码来实现这一点,无需检测User-Agent等信息。

      2. 对于同一浏览器,桌面版和移动版页面使用不同的User-Agent,因此目前使用单一User-Agent并非可行方案。

        1. 这可能不会让你感到意外,但我认为通过同一URI同时提供移动版和桌面版是一种糟糕的做法,必须停止。鼓励移动用户使用应用程序替代网页更是不可接受。

    2. > 我猜如果存在普遍定义并被遵守的标准,那么浏览器只需声明“我支持HTML 1.3”即可。

      可能不会;那些不落后于实现的网络标准最终会像XHTML 2.0一样。

    3. 我觉得网页管理员自己挖了个坑,制造了这个混乱。我更倾向于直接提供页面,让市场自行解决。开发者会更快行动以确保自己的代码不被破坏,或许浏览器战争和随后的黑暗时代就不会发生。

      1. 这并不是一个务实的解决方案。用户并不关心这是浏览器的错,他们会选择用户体验更好的服务。

    4. 一个定义了“正确”显示方式的页面渲染器参考实现,以配合规范。

    5. > 为了达成良好的解决方案,还能采取哪些不同的做法?

      或许可以考虑制定一个标准化的特性检测 API。

      1. 这种机制已经存在:参见 DOMImplementation.hasFeature。

        但实际情况是,有些浏览器在特性检测中返回“true”,而其实际实现并未达到作者期望的功能。这有各种原因:特性检测与特性实现解耦、特性中的 bug 无法被实现捕获、检测不够精细等。也有案例中 hasFeature 返回 “false” 而特性实际上可用,原因类似。

        简而言之,目前 hasFeature 的规范实现及浏览器实现均为 “返回 true”。

      2. 起初我以为特征检测是指Sobel、LoG等,这让我在阅读回复时感到非常困惑。

    6. 其他协议是如何处理版本控制的?SSL/TLS似乎做得还不错。

      1. 绝对不行。

        在 TLS 中,我们现在有两个虚假的版本号,你应该忽略它们。我们还有一个扩展,它会指示真实的版本号。它还会发送一堆虚假的版本号,以“训练”服务器预期并忽略虚假的版本号。这都是因为服务器供应商发现实现“如果我收到高于我支持的版本,我就用我支持的最高版本进行响应”太过复杂。相反,他们通常实现的是“如果我收到高于我支持的版本,我就断开连接”。

        但所有这些都不足以让 TLS 1.3 正常工作。它现在还包括发送一堆没有意义且被忽略的虚假消息,只是为了让它看起来更像 TLS 1.2。

        David Benjamin最近在Real World Crypto上对此进行了总结:https://www.youtube.com/watch?v=_mE_JmwFi1Y

  11. 我记得在Firefox的早期阶段,有些网站会拒绝向非Internet Explorer的浏览器提供页面。我看不懂这样做的意义,也不觉得有趣。

    Firefox本身没有显示这些页面的问题,所以我不得不安装一个插件,让Firefox伪装成Internet Explorer,这样我才能看到网页。

    我很高兴那些日子已经结束。

    1. > 我很高兴那些日子已经结束。

      那些日子还没有结束。

      如果你尝试使用其他浏览器,Google Earth 会显示“需要 Google Chrome 才能运行新版 Google Earth”或“哦,不!你的浏览器尚未支持 Google Earth”:

      https://www.google.com/earth/

        1. 谷歌不仅仅对地图这样做。观察一下谷歌搜索结果页面在 Android 上的 Chrome 和 Firefox 中的差异:https://imgur.com/a/A8TYQ

          我确信有些人会说他们更喜欢简洁的界面,但事实仍然是,他们为非Chrome用户提供了一个质量较低的版本(例如,无法使用按日期筛选的搜索工具等功能)。

        2. 当时,asm.js是高性能网络应用的标准,而谷歌决定采用一种仅他们使用的格式,且不兼容其他任何浏览器,忽视了当时仍在开发中的WebAssembly。

          尽管他们使用了一个简单的编译器后端,可以在几天内将原生代码编译为NaCl,同时支持asm.js和WASM(整个游戏引擎都已通过这种方式移植),但谷歌已经用了几个月时间,仍然坚持只在Chrome上使用。

          1. 你读过我链接的文章吗?它解释了为什么他们选择NaCL而非ASM,以及尽管他们已经拥有WASM原型数月,但它尚未准备好投入生产。

            基本上:原生线程。NaCL支持它,而ASM和WASM目前不支持。

            1. 那就不发布它。

              这不是谷歌第一次发布仅限于Chrome的产品,试图吸引更多用户到自己的平台。即使这不是直接意图,结果也是巨大的反竞争效果。

        1. 更改User-Agent不够,因为它并非单纯依赖User-Agent。它实际上在进行功能检测,如果你的浏览器不支持远程桌面所需的特定功能,它会直接显示错误信息,而非通过白名单机制屏蔽特定浏览器。这就是需要使用非通用功能的网络应用程序应该如何工作的原理。当然,可以检查User-Agent以屏蔽不支持的浏览器,但对于支持的功能,应使用功能检测,这样新推出的支持该功能的浏览器就能正常工作,而无需修改白名单中的User-Agent。

        2. 或者使用Slack的网页版本进行通话或屏幕共享。

      1. 谷歌早已采用这种做法。例如,多年前若使用Opera浏览器访问Google Docs,会显示不支持该浏览器的警告。如今谷歌通过User-Agent选择YouTube界面版本(若不幸使用现代浏览器,将获得那个明亮的白色界面和巨大边距)。

      2. 此外,Skype的网页版本在Android浏览器上无法正常工作。

    2. 还没结束。

      如今,我在Android版的Firefox上查看Facebook消息时,必须通过修改User-Agent来伪装成Android 4系统。

      不过,我庆幸这只是少数几个不负责任的网站。以前整个网络的一半都是这样。

      1. 遗憾的是,我对亚马逊音乐也做了类似操作。我的Chrome未启用内置Flash播放器,且Linux浏览器不支持基于网页的DRM,因此我使用User-Agent扩展程序让其网站认为我在Windows系统上运行,这样就能正常使用。

      2. 等下,这真的有效?我已经放弃在手机上使用Facebook了。

        如果你不介意……你具体需要做什么?

      3. 即使在mbasic.facebook.com上?这就是我如今处理所有消息的方式。

        1. 我非常讨厌Facebook的这种做法。他们的应用程序过于臃肿,跟踪的信息远超我愿意分享的范围。过去发送消息根本不是问题。

          但现在突然无法在不进入笨重的Facebook版本的情况下发送消息。

          1. 我对Facebook的反对其实并非针对它本身。我愿意接受参与Facebook所需的权衡。我希望它能更好,但Facebook是在响应激励机制并因其行为获得回报,所以我很难讨厌它,或期待它具备道德高尚性。

            Facebook只是在做资本主义告诉它可以做的事。讨厌Facebook是浪费精力。我们必须停止奖励那些我们不希望重复的行为。

      4. 这完全是另一个问题,对吧?你对Chrome的体验不同吗?

    3. 其中一个问题是,针对IE的公司通常使用VBScript而非JScript开发网站,因此不重新编写代码就无法兼容。

      如今有大量仅支持Chrome的网络应用。

      1. > 其中一个问题是,针对IE进行开发的公司的网站通常使用VBScript而非JScript进行开发,因此在不进行重新编写的情况下无法兼容。

        基于:

        >> Firefox 能够正常显示这些页面

        这可能与 VBScript 无关

      2. Netflix 曾经拒绝在 Firefox 上运行,我不得不安装 Chrome 才能访问一个网站——这简直令人抓狂。

          1. 但一个缺点是,即使你付费订阅了1080p,Netflix仍然限制Firefox只能播放720p视频:

            https://help.netflix.com/en/node/23742

            你可以通过按下 Ctrl+Alt+Shift+D 快捷键调出 Netflix 的调试信息(再次按下可关闭),查看当前分辨率。你还可以通过测试图案视频验证分辨率。

            令人遗憾的是,1080p 视频在 Firefox 中运行正常。有一个 Firefox 插件可启用 1080p 流:

            https://addons.mozilla.org/en-US/firefox/addon/force-1080p-n

            1. 但这也是 Chrome 的限制。只有 Edge、IE 和 Safari 浏览器支持 1080p。这让我意识到其实我并不需要 1080p,因为我之前根本没注意到。

              1. 你离屏幕有多远?屏幕有多大?

        1. 那是在Mozilla还有骨气、为用户发声的年代,尽管用户一直在抱怨

          后来他们妥协了,现在标准中有了DRM……真是悲哀的时代

          1. > 尽管用户一直在抱怨

            > 后来他们妥协了

            有些人称之为“回应用户反馈”。你不认同他们的决定固然令人遗憾,但试图因Mozilla倾听用户需求而将其描绘成负面形象,实属荒谬。

              1. 是的。我之所以说这荒谬,是因为他们做了任何组织(我指的是任何组织,包括公司、非营利组织、政府等)都应该做的事情——倾听用户的声音。

                他们的理念固然伟大,但归根结底,他们提供的是面向最终用户的產品,所以如果用户抱怨说他们希望在Firefox上使用Netflix和其他EME服务,那么正确的选择就是尽可能让用户满意。

                1. 那么,前用户呢……因为他们是最 vocal 的人群,这些 Chrome 叛徒不重视自由、隐私或安全。

                  他们的实际用户要求他们不要这样做,不要采用 Web 扩展,不要在每个系统上强制安装广告软件,不要将侵犯隐私的功能设置为默认开启而非默认关闭。他们不要接受开放网络的毁灭……

                  我们,真正的Firefox用户群体,被Mozilla竖起了中指,而他们却以一个可悲的借口进行乞讨式营销,乞求用户回到他们的Chrome克隆版

                  1. 任何组织都关心其用户群体整体。没有区别。没有“前用户”、“叛徒”或“真正的Firefox用户群体”。只有“用户”。因为一旦用户数量达到一定规模,就需要从统计学角度做出决策。

                    如果70%的用户想要Netflix,而30%的用户想要隐私,那么Mozilla会关注那70%。因为从任何组织规划的角度来看,这才是合理的。你不会试图讨好一个微小的少数群体(是的,注重隐私的个人在世界上确实是少数。我们可能在HN上处于一个泡沫中,但普通人不会在乎我们可能关心的隐私问题),而你可以通过做相反的事情来讨好更多的用户。

                    你已经明确表示你在这一论点中存在偏见。也许你应该退一步,更客观地看待这个问题,或者从另一个角度来看。

                    1. 我非常客观,Mozilla基金会是一个非营利免税组织,它获得免税地位是因为它应该遵循其组织声明的目标,而不是为了受欢迎。

                      Mozilla基金会拥有免税地位是为了促进开放网络。

                      他们不再遵守这一目标,因此应失去免税地位,不应再自称基金会,也不应继续虚假宣称自己致力于隐私保护和开放网络。

                      如果他们想开发一个不安全、侵犯隐私的浏览器,那完全没问题。谷歌和微软早已这样做。

                      他们需要诚实面对这一点,不要自诩为自己并非真正代表的事物。

                      他们并不为开放的网络而战,他们并不为用户隐私而战,他们并不支持《Mozilla宣言》中所述的目标。因此,它应该被移除,Mozilla基金会应该解散,并重组为一家以盈利为目的的软件供应商,开发商业网络浏览器。

                      你认为Mozilla与谷歌、微软或其他商业软件供应商没有什么不同。他们是一家软件公司,致力于为客户提供最好的软件。

                      Mozilla没有客户,Mozilla不应也不应该是商业实体,Mozilla是一个慈善基金会,其目标正被违反。

    4. 在那段时期,每个浏览器都有自己独特的渲染网站的方式(甚至包括Firefox)。其中没有一种是真正“正确”的,但IE的渲染方式成为了事实上的标准,因为IE拥有90%以上的市场份额。如果你有一个网站,如果布局渲染不正确可能会“损坏”,那么最简单的方法就是测试它在IE中是否按你期望的方式工作,然后添加一个注释,告诉人们它可能在其他浏览器中损坏(或不向他们提供服务)。

      直到人们开始真正关注标准兼容性和跨浏览器兼容框架,情况才有所改善。HTML/CSS/JS标准兼容性的“酸性测试”帮助确定了当时各浏览器的兼容性水平。在那一时期,大多数浏览器都非常糟糕,直到Chrome出现且WebKit开始流行,标准兼容性才成为重要议题。最终,大多数主流浏览器在渲染方面都具备了良好的标准兼容性,而像jQuery这样的工具则帮助弥补了不同浏览器行为差异带来的问题。

    5. 如今,谷歌搜索本身也采用了这一技术。

      尝试在火狐移动版和Chrome移动版上访问Google.com,你会发现两者存在显著差异。

      要让95%的功能正常工作,你需要伪造一个ChromeUser-Agent。在2018年。

      1. 我刚刚用Android上的最新版本Chrome和Firefox尝试了这个。Firefox版本加载了一个看起来像2013年桌面网站的页面,但字体更大;Chrome版本加载了一个常规的现代界面。

        伪造User-Agent头部(太棒了,Android 上的 Firefox 支持所有桌面扩展)后,Firefox 上的所有内容都恢复正常。

    6. 有时,在我的 Linux 系统上使用最新版本的 Firefox 时,会遇到一个网站提示我需要最新版本的 Firefox / Chrome / IE…

      1. 我记得有个ActiveX插件/模块/什么的,可以在IE中通过Google Chrome框架运行你的网站。虽然是个糟糕的 hack,但确实效果很好。

        1. Chrome Frame。这是由Google本身发布的。

    7. 去年我遇到一个网站,如果浏览器报告操作系统为Linux,它就无法正常工作。但如果伪装成其他系统,就能正常运行。

    8. 在网景浏览器时代,网页会提示IE用户“使用真正的浏览器”

        1. 我怀疑这在开发成本与“税费”收入之间从未实现过盈亏平衡。

          (是的,我明白这可能只是个玩笑)

    9. 它们还没有结束。谷歌在 Hangouts 中使用了一些奇怪的 WebRTC,这在 Firefox 中无法正常工作,等等。

    10. 而在最新版本中,https://github.com/google/closure-library/issues/883通过UA嗅探阻止了Firefox与其他浏览器在箭头键是否触发键盘事件上保持一致,这导致其他假设箭头键不触发键盘事件的Google功能出现故障。

      此外,Closure 假设只有User-Agent中包含“WebKit”的浏览器可能在移动设备上运行,并且所有浏览器都属于 WebKit/IE/Edge/Gecko 类别(如果浏览器不属于这些类别,将会出现严重故障)。

      而这仅仅是一个库。

    11. User-Agent检测仍然存在。

      如果你使用的是除批准的四个浏览器(Edge/Safari/FF/Chrome)之外的其他浏览器,许多网站会不断提示你。

  12. 任何涉及User-Agent的操作都应使用 ua-parser[0]. 不要尝试自己实现这些功能。

    如果您的语言中不存在 ua-parser,只需从 ua-core 中提取 yaml 文件。该文件定义了您应使用的正则表达式以及它们如何映射到浏览器版本(以及操作系统版本和设备)。

    [0] https://github.com/ua-parser

    1. 为 WhatIsMyBrowser.com API 进行无耻宣传:

      https://developers.whatismybrowser.com/api/

      根据现代网页开发标准:您应始终使用特性检测而非User-Agent嗅探来处理跨浏览器问题;然而,准确的User-Agent检测对于排查客户问题、检测机器人、发现趋势等非常有用。

    2. 您是在鼓励人们准确地进行浏览器嗅探吗?难道我们不应该阻止这种嗅探行为吗?

      1. 理想情况下,您根本不需要关心这些。您只需开发支持 HTML 4/5/6 规范的浏览器即可。

        现实中,浏览器存在已知漏洞且持续多年,你需要收集统计数据来制定支持策略,并需要复现客户遇到的漏洞。

        示例:旧版本的Firefox在使用第三方JSONP API时存在远程代码执行(RCE)漏洞。如果你使用这些API但未屏蔽这些Firefox版本,你的用户将面临安全风险。

        1. 完全正确。我曾因 Chrome 45 阻止 Flash[0]而遇到此问题。尽管这可能看似不值得针对特定浏览器进行优化,但 Chrome 阻止 Flash 的实现方式却是广告商的噩梦。为了正确渲染页面,页面会以启用 Flash 的方式加载所有内容。随后,它会暂停所有未被标记为“重要”内容的 Flash 运行时。这导致视频广告有足够时间播放几帧并触发展示计数,从而使广告商因展示广告而被收费。这对我们(一家大型视频广告交易所)而言是赤裸裸的欺诈行为,因此我们不得不坚决阻止 Flash 广告在 Chrome 45 及后续版本中购买广告位。

          我们使用了 ua-parser,一切进展非常顺利。

          [0] https://www.infoq.com/news/2015/08/chrome-45-flash

      2. 你可能还想出于其他原因解析User-Agent。我最近在一个项目中使用了这样的库,该项目会以人类可读的格式向用户展示其登录历史,包括所使用的操作系统和浏览器(例如“Firefox 58 on Linux”)。

  13. User-Agent字符串随时间推移发生变化并变得更加臃肿,这相当有趣。

    其他有趣的事实:

    – iOS 上的 Chrome 会报告其 Chrome 版本(例如 64.0.36),但无法获取底层 Safari 引擎版本。

    – Android 网页视图已将一种User-Agent字符串模式替换为另一种,且替换频率接近三次(KitKat 之前、KitKat 至 Marshmallow,以及 Marshmallow 及以上版本)。

    – Chrome 继续在其User-Agent中添加“WebKit”版本,即使在分支到 Blink 之后也是如此。不过自 Chrome 27 以来,WebKit 版本始终显示为“537.36”。

    来源 – 我编写了一个程序化生成User-Agent字符串的库 – https://github.com/pastelsky/useragent-generator

  14. 我需要将此内容收藏起来,以便下次听到同事说“哦,我们只需将参数编码为字符串”时使用。

      1. 通往地狱的道路是由那些暂时性的例外情况铺就的,直到我们实施更好的解决方案为止。 🙂

  15. 一些有趣的细节:

    > ProductSub 对于 Chrome 和 Safari 返回 20030107,因为这是 Safari 的发布日期,而 Safari 使用了 Apple 的 WebKit 分支。Chrome 也使用了这个分支。对于 Firefox,它是 20100101。我不知道为什么。

    > Vendor 对于 Chrome 返回 “Google Inc.”,但对于其他浏览器返回 undefined。

    > Navigator 可以判断你的设备是否支持触摸屏

    > Navigator 可以判断你有多少个逻辑核心

    > appCodeName 始终返回 “Mozilla”,而 appName 始终返回 “Netscape”

    > Navigator 可以判断你是否使用:Wi-Fi、以太网、蜂窝网络、蓝牙或 WiMAX

    > Navigator 知道你有多少内存

    > 以及你正在使用的确切插件。Firefox 的User-Agent不会隐藏 ‘type’:'application/x-google-chrome-pdf'

    > 你的屏幕可以通过 Navigator 共享——无需你的许可

    > 语言设置为 `US-en` 或 `en` 以区分美国和英国用户

    > 您的电池状态可被 Navigator 通过 ACPI 读取

    > 文件权限可被读取,从而揭示用户名

    而这仅仅是 Navigator 的功能,等到您看到 JavaScript 和 Canvas 能做的一切有趣事情时,您会更加惊叹。

    1. > 对于 Firefox 而言,该日期为 20100101。我不知道原因。

      在某个时间点,该日期曾是 Firefox 的构建日期。随后,有人提出该日期可能被网站用于追踪用户,因此将其修改为 20100101。

  16. 应该改为“为什么每个_浏览器_User-Agent字符串”……非浏览器代理通常不会(也不应该)使用 Mozilla 的技巧。

    1. 实际上,我们不得不将“Mozilla”添加到我们其中一个程序的User-Agent中,因为用户抱怨被某些代理阻止。

      1. 我可以实现按浏览器切换内容,但通过代理服务器进行阻断是一种不良做法。这可能是由某些机器人滥用行为驱动的,但无疑是一种非常错误的处理方式。

  17. 我从那篇文章中了解到Mozilla的含义:Mosaic杀手。

  18. > 你最喜欢的网页浏览器是什么?

    Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13

    1. 我希望有人能解释一下“U”的来源;它首次出现在Mozilla与Gecko一同诞生时

      1. 这与加密算法有关,当时美国对密钥长度有出口限制。U代表美国(128位),I代表国际(40位),N代表无。如今“U”只是User-Agent字符串中残留的一部分。

      2. 快速搜索解答了我的疑问——“U”代表美国;由于加密出口限制,早期浏览器中提供了不同安全级别的版本:U(SA) = 128位,I(nternational) = 40位,或N(one)。

  19. 对于像我这样出生于90年代、可能并不了解这段背景故事的人来说,这是一堂精彩的历史课。

  20. 原帖发布于2010年。对于那些好奇在这个时代,一个全新的浏览器引擎会采用何种User-Agent的读者,可以参考这篇关于为Servo设计User-Agent的讨论,其中涉及从热门网站收集数据以观察它们如何处理User-Agent:https://github.com/servo/servo/issues/4331

    简而言之:您可以在这里查看每个平台的最终结果:https://github.com/servo/servo/blob/2d3771daab84709a6152c9b5…,看起来像是 "Mozilla/5.0 (Windows NT 6.1; Win64;x64;rv:55.0) Servo/1.0 Firefox/55.0"

    1. 看到在 ARM 上构建 Servo 时会返回 “i686” 作为 CPU 架构,这很好。因为有很多网站会直接匹配User-Agent字符串中的 /arm/,并将其重定向到移动版本,无论你的User-Agent实际上是什么。这对我们这些使用 ARM 桌面的人来说非常令人烦恼(我承认这是一个很小的少数群体)。

  21. 每个动画GIF都带有“Netscape 2.0”应用扩展的类似情况。

  22. 说“…并使用了KHTML”忽略了整个Konqueror项目以及Konqueror在Safari首次发布之前就已存在的事实。我曾在KDE 2.0桌面上愉快地使用Konqueror一段时间。

  23. User-Agent属性已被 Patrick H. Lauke 在 W3C 讨论中恰当地描述为“一个不断膨胀的谎言集合”。(“或者说,这是一个平衡行为:添加足够多的遗留关键字,以避免旧的User-Agent嗅探代码立即崩溃,同时仍试图传达一些实际有用且准确的信息。”) [https://superuser.com/questions/1174028/microsoft-edge-user-…]

  24. 我曾经遇到过类似的问题。我构建了一个基于页面加载时激活的特性列表设计的跟踪和分拆测试系统。因此,单次页面加载可能被描述为:

    root,signin,bluebutton

    其中bluebutton是我们正在测试的登录页面设计。当然,一旦bluebutton正常工作并运行了一段时间, everyone都害怕更改它,以防存在某种依赖关系。因此,取代旧登录功能的Facebook登录功能会显示为:

    root,signin,bluebutton,fbookredirect

    尽管实际上并未显示登录页面,更不用说bluebutton了。

  25. 哇。真是个乱七八糟的局面!

    不过这篇文章确实很有趣! 🙂

  26. 我猜在当今现代网络时代,User-Agent字符串已不再那么重要,基本上可以设置为任何内容?

    1. 上次我用Lynx浏览《经济学人》网站时,除非更改User-Agent字符串,否则无法正常工作。乱码字符串可以接受,但显然Lynx不行。

    2. 有些服务器会根据User-Agent字符串判断请求是来自浏览器还是机器人,从而提供不同的页面。虽然机器人很容易伪装成任何东西,但有些服务器仍然会根据User-Agent字符串进行判断。

      1. 仍然有用,因为存在明显的差异,比如“Flash 正常工作”或“CSS 网格正常工作”。

    3. 我设置了一个扩展程序,随机化我的User-Agent字符串,以查看会发生什么,结果一些主要网站严重损坏。一些网站给我降级模式(谷歌多次这样做)。此外,许多网站使用User-Agent进行操作系统检测等,因此如果你想正确下载,必须至少部分正确地设置UA。

      有人可能会认为,到了2018年,应该有API能够以比解析随机混杂的遗留标记(即常见的User-Agent字符串)更优的方式检测这些信息。但现实是,解析User-Agent字符串仍然是主流做法,而且不幸的是这种情况仍在持续,甚至包括一些技术领先的大型网站。

      1. 如果主要供应商之一将此设为默认行为,那将非常理想。网站将开始有理由清理这一混乱。

    4. 不,User-Agent嗅探依然盛行。谷歌尤其如此,但许多网站都在这么做。尝试更改你的User-Agent,看看有多少东西会出错。

    5. 我确实尝试过使用随机User-Agent浏览——许多网站都无法正常显示。不妨试试看!

    1. 新页面不是问题——20年前编写的页面仍然存在,可能依赖于Mozilla/5.0的存在才能正确渲染。

  27. 如果未来20年后需要通过头后插入插头连接互联网,User-Agent应设置为何值?

  28. 精彩文章。能否在标题中添加[2008]?

  29. 实际文章标题:“浏览器User-Agent字符串的历史”

  30. 标题纯属虚构。我读过这篇文章,它确实介绍了浏览器战争中的一些有趣历史。然而,只需粗略查看网页服务器日志,就能发现User-Agent字符串有时是空的,或以“MobileSafari”或“UrlTest”开头。User-Agent字符串由客户端生成,可以是客户端想要的任何内容。

    1. 啊。哪些浏览器默认使用这些设置?

  31. 我好奇这篇文章的作者是否信仰宗教。

    1. 从他使用的措辞如“在起初”和“看哪”,我认为是的。我挺喜欢这种语气。

    2. 我认为这是为了营造一种“古老时代”的氛围。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

你也许感兴趣的: