Firefox 即将进入两位数版本时代,是时候检查你的 UA 探测脚本了

我们都知道:基于 UA 的浏览器检测 是一种不好的做法,正确的方法是特性检测。无论如何,遗留代码依赖于 UA 探测,可能需要针对 Firefox 10 的发布进行更新。

即使看起来很简单,UA 解析已被证明对许多脚本作者来说都是一个难题。尽管UA 的结构在 HTTP 规范中定义,但相关信息传递的方式在不同的供应商之间有所不同。此外,你想要从中提取的信息并不总是相同的:有时你想要知道浏览器(Firefox、SeaMonkey、Safari、Chrome、IE、Opera 等),但大多数时候你想要知道驱动它们的引擎(Gecko、Webkit、Trident 等)。你还需要获取浏览器或引擎的版本。

旧脚本通常会做出一些不必要的假设。有些假设浏览器版本号永远不会达到 10……事实并非如此:Opera 和 Chrome 早已突破了这一里程碑,Firefox 将在下周达到,而IE 也将在不久之后

一些你的脚本应该允许的 Firefox UA 示例

  • 常规 Firefox 版本:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:10.0) Gecko/20100101 Firefox/10.0
  • Nightly 和 Aurora Firefox 版本:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:12.0a1) Gecko/20120122 Firefox/12.0a1
  • Chemspill Firefox 版本(三位数) Mozilla/5.0 (Windows NT 6.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1

所以,在你的网站陷入混乱之前,这是最后一次检查你的基于 UA 的浏览器检测代码的机会!

最后一次检查机会

现在就去做,两周后就太晚了。

该怎么做?

  1. 代码检查:检查你的代码,看看是否存在一些基于 UA 的浏览器检测代码。如果有,请检查它是否处理多位数版本。(同时,你可以检查它是否还有用。一些旧的 UA 检测代码已经很久没用了,或者试图解决浏览器多年来已经修复的问题……)
  2. 库检查:许多库执行基于 UA 的浏览器检测。如果你正在使用其中任何一个,请检查它是否仍然适用于带有两位数版本的 Firefox。如果不是,请通知库的作者并在Bugzilla 上提交一个错误,以便我们可以帮助其他人,因为他们所有的客户都可能遇到同样的问题。
  3. 检查你的网站是否适用于下一个 Firefox 版本:下载Firefox 10 的 Beta 版本(你可以同时运行多个版本的 Firefox 同时) 如果你正在维护一个网站,使用 Firefox 的 Beta 甚至 Aurora 版本始终是一个好主意:你将更早地发现不兼容性,并在用户开始抱怨之前获得时间来修复它们。我们正在尽最大努力防止出现问题,但有时旧代码依赖于不正确的行为,即使我们只是修复了错误,它们也会停止工作。
  4. 测试其他网站 :-)。使用 Firefox 的 Beta 或 Aurora 版本浏览网页。当你遇到与 UA 相关的错误时,在 Bugzilla 上报告它。尽可能多地提供信息,例如该网站在你所在国家的的重要性以及你是否自己采取了任何措施。这样,我们的布道团队才能适当地优先安排工作。

最后,你应该计划摆脱这些基于 UA 的浏览器检测机制。如果你不能——我知道这并不总是可能的——我很乐意知道原因:所以请在下面的评论中告诉我们。

现在是时候检查你的网站了 :-)

非常感谢你的帮助。

关于 Jean-Yves Perrier

Jean-Yves 是 Mozilla 开发者推广团队的项目经理。在此之前,他是一名 MDN 技术作家,专门从事 Web 平台技术(HTML、CSS、API),并且担任了多年的 MDN 内容负责人。

Jean-Yves Perrier 的更多文章……


41 条评论

  1. David Mulder

    我记得使用一些浏览器检测 + 操作系统检测来相应地设置某些输入元素的样式(其中一个是文件上传字段)。其次,我还使用它来解决不同浏览器之间字体大小的 1 像素差异(我不太记得具体细节了,所以我不确定这是否是浏览器问题还是(谷歌网页)字体问题)。无论如何,这两个问题都无法直接检测到。哦,我还使用这种检测来阻止非移动设备访问移动 Web 应用程序。

    2012 年 1 月 23 日 02:12

  2. Mathias Bynens

    可能在本文中包含一个两位数 UA 字符串示例会很有用。

    2012 年 1 月 23 日 03:11

    1. Jean-Yves Perrier

      你说得对。我已经添加了一些典型的两位数 Firefox UA。

      2012 年 1 月 23 日 04:56

  3. Benno

    这将是一个移除任何构建日期依赖的好机会,因为现在它已经冻结了一段时间,稳定版本的构建日期为 20100101,将来可能会被移除。
    https://bugzilla.mozilla.org/show_bug.cgi?id=572661
    https://bugzilla.mozilla.org/show_bug.cgi?id=660498

    2012 年 1 月 23 日 04:44

    1. Jean-Yves Perrier

      不会同时进行。但这将在下一个 Firefox for Mobile 版本中发生。在桌面版上,它可能在那之后发生,或者之前,或者根本不发生。

      2012 年 2 月 14 日 05:01

  4. Aryeh Gregor

    这是一个 MediaWiki 使用 UA 探测 Gecko 的案例

    http://svn.wikimedia.org/viewvc/mediawiki/trunk/phase3/skins/common/wikibits.js?revision=108550&view=markup#l495

    注释很好地解释了这一点。理论上可以通过创建一个 iframe 并将其粘贴到页面中,并在其加载完成之前导航到一个片段,然后查看它是否跳转来测试它,但在现实中,这并不实用。因此,使用 UA 探测来代替。

    2012 年 1 月 23 日 16:52

  5. Mogden

    在解决浏览器错误时,UA 版本探测是不可或缺的。例如,Chrome Windows < 18 在播放大量 HTML5 音频时存在严重问题。它会在某个不可预测的时间崩溃。我们如何检测到这一点,以便以一种好的方式减少应用程序中声音的使用?

    2012 年 1 月 25 日 13:12

  6. Tai Travis

    Modernizer js 库是解决此问题的绝佳方案。你可以配置自定义下载,因此你只需要测试所需的特性。

    2012 年 1 月 25 日 21:05

  7. Leisha Fleming

    抱歉,各位技术人员,

    我只是一个对一个基本问题感到困惑的普通女孩。上次我将 MF 更新到 9.0.1 时,我通过 ATT/Yahoo 使用的电子邮件帐户变得很混乱。我不得不不断登录,即使“保持登录状态”已选中。当然,他们说这是 MF 的问题。它显然改变了一些东西。此更新将对我的计算机做些什么???我是否应该再次更新?我害怕……。

    2012 年 1 月 31 日 11:17

    1. 可能

      我已在 Bugzilla 中搜索了此问题。
      https://encrypted.google.com/search?hl=nl&q=site%3Ahttps%3A%2F%2Fbugzilla.mozilla.org%2F+att+email+firefox+9.0.1&oq=site%3Ahttps%3A%2F%2Fbugzilla.mozilla.org%2F+att+email+firefox+9.0.1&aq=f&aqi=&aql=&gs_sm=e&gs_upl=35383l38347l0l39269l10l10l0l9l0l0l39l39l1l1l0

      出现的错误是:https://bugzilla.mozilla.org/show_bug.cgi?id=713014

      根据那里的信息,当你更新到 Firefox 10 时,问题应该会得到解决。
      所以是的,我绝对建议你更新。另一个更新的原因是过时的软件会带来巨大的安全风险。如果你检查了你的其他软件(https://secunia.com/vulnerability_scanning/online/)或至少你的插件(https://www.mozilla.org/en-US/plugincheck/),那就明智多了。

      希望这有帮助!

      2012 年 2 月 1 日 03:52

    2. David W, Smith

      我仍然使用 Fire Fox 4,这样我就可以保留我的 Yahoo 和 Google 工具栏。如果我无法使用它们,那么我会转到工具下的下载。我不得不向下滚动很远才能找到旧的 Fire Fox 4 下载,我重新下载了它,这样我的 Yahoo 和 Google 工具栏就回来了。其他人说,在电脑上保留旧版本的 Fire Fox 并不能很好地工作,所以我只能说,对于你的问题,只需返回并使用之前对你有用的版本。但是,你仍然会随机收到更新到较新版本的 Firefox 的弹出窗口。我只是点击红色 X 来使其消失。所以我建议你回到对你有效的方法,如果这是一个广泛存在的问题,那么其他人也会收到信息,你可以稍后再查看他们是否修复了此问题。我一直在寻找任何可能说明他们已修复工具栏问题的提示,所以我将继续使用 Fire Fox 4。它对我有用。只需复制并粘贴此链接 http://download.mozilla.org/?product=firefox-4.0&os=win&lang=en-US 这对你也有效,就像对我一样。

      2012 年 2 月 2 日 15:22

      1. Jean-Yves Perrier

        我今天不会使用 Firefox 4 来浏览网络。建议使用未维护的版本是非常糟糕的建议。

        它存在安全漏洞,这些漏洞正在被恶意利用。

        2012 年 3 月 1 日 00:42

    3. Robert Schwedt

      此外,你还会在 Yahoo 新闻评论中遇到问题,它们永远无法正确加载,我使用 FF 时也遇到了一些 Facebook 问题,如果它打开新标签页,FF 就不想加载页面。

      2012 年 2 月 29 日 13:47

      1. Jean-Yves Perrier

        当遇到 Firefox 问题时,最佳做法是访问 SUMO(http://support.mozilla.org)。在那里,拥有所需专业知识的人可以帮助你。

        无论如何,我建议你尝试以安全模式启动 Firefox,暂时禁用其扩展程序:Facebook 问题不太可能在发布前被忽视,因为有很多人都在使用该网站,所以可能是某个扩展程序导致了混乱。无论如何,这将是 SUMO 人员要求你采取的第一项措施。

        2012 年 3 月 1 日 00:45

  8. Nick Gilbert

    说真的,这种情况真的发生过吗?!没有人会将版本号存储在一位数的字符字段中。他们更有可能将其存储为字符串或整数。

    2012 年 1 月 31 日 13:31

    1. Brent Tilley

      我对本文标题的直接想法是,人们使用了类似于 PHP 的 strpos() 的函数,并在提取版本号后检查是否存在“1”。当然,对于版本号为 10、11、12 等的浏览器,这将返回 true。

      2012 年 1 月 31 日 13:48

    2. Yehuda

      @Nick
      将版本号存储为字符串可能会导致版本检测问题。在 JS 中,如果你测试“10.0” >= “3.6”,你将得到布尔值 false,因为这是一个字符串比较,而不是数值比较。

      2012 年 1 月 31 日 14:53

    3. Simon

      这并不是存储在一个一位数字段中的问题——而是他们正在寻找什么的问题。我们的基于 Web 的应用程序将我们知道无法正常工作的旧版浏览器列入黑名单,它通过在用户代理中查找字符串“Firefox/1”来做到这一点。当然,这与“Firefox/10”匹配,导致新版本被阻止。

      当然,很容易解决——我已经将其更改为专门查找 1 后面的点,这仍然与旧的用户代理匹配,但与 FF10 不匹配。但它确实需要修复。

      2012年1月31日 15:19

      1. Nick Gilbert

        好的,我明白了问题所在。不过,我个人永远不会编写将数字像字符串一样处理的代码,因为出于显而易见的原因,这是一个愚蠢的想法,我可能会解雇任何将这种类型的黑客放到我代码附近的人……:)

        2012年1月31日 15:48

      2. Nick Gilbert

        ……尤其是因为这段代码无法工作是如此明显。这就像检查浏览器是否是 Firefox,查看字符串“Fire”是否出现在用户代理字符串中的任何位置一样愚蠢。它可能在一段时间内有效,但当出现名为 Fireblaze 的浏览器时,你就完蛋了。

        2012年1月31日 15:52

        1. Brent Tilley

          更不用说用户代理字符串可以被伪造为几乎任何东西。

          2012年1月31日 16:03

        2. Simon

          呃,它适用于其预期用途,即检测运行不受支持浏览器的用户,并将他们重定向到一个告知他们此情况的页面。

          这是一个企业应用程序,因此支持所有浏览器并不是目标——它只需要识别 Firefox 和 IE,并在两者的支持版本和不受支持版本之间进行区分。如果他们通过伪造用户代理来解决这个问题,那也没关系——这仅仅意味着他们没有必要报告问题,因为“你没有理解‘不受支持’的哪一部分?”。

          2012年1月31日 19:11

          1. ZiggyTheHamster

            无论是否是企业应用程序,排除“不受支持”的浏览器,因为它们不是 Firefox 或 IE,这并不是一个好的做法。Iceweasel 与 Firefox 兼容,但无法访问您的应用程序,因为它不受支持。

            2012年2月13日 14:35

  9. fgsfgsg

    谷歌 Orkut——巴西流行的社交网络——将 Firefox 10 视为版本 1。

    到目前为止,还没有采取任何措施来解决。

    2012年2月3日 08:20

    1. Jean-Yves Perrier

      1月23日已联系谷歌。请参阅 https://bugzilla.mozilla.org/show_bug.cgi?id=720179

      2012年2月10日 11:00

      1. Jean-Yves Perrier

        Orkut.com 和 Orkut.com.br 最终在欧洲夜晚得到了修复!

        :-)

        2012年2月10日 22:54

  10. Alhadis

    我倾向于尽可能避免 UA 探测,但我经常使用的一种方法是在服务器端检查 CSS3 渐变支持是否存在。我编写了一个 PHP 函数来检查用户的浏览器是否能够渲染 CSS3 渐变;如果不是,它会输出一个样式表链接,将背景图像加载到 DOM 中。

    现在,我本可以始终在声明线性或径向渐变的行之前包含背景图像,但我注意到 WebKit 仍然向 URI 发送 HTTP 请求(而 Firefox 则不会)。为了尽可能优化服务器需求,我决定仅为似乎能够渲染渐变的浏览器加载这些背景图像。

    到目前为止,它运行得很好。最糟糕的情况是背景中仍然显示纯色。但这是一个 UA 探测如何用于一些相当次要和美学方面的示例。

    2012年2月7日 01:11

  11. mei

    我不是电脑技术高手……我只知道在我的运行 OS 10.5.8 的 Mac 上更新 Firefox 后,我很难甚至无法上网……非常不方便,我需要知道如何修复(如果可能的话)……可以告诉我如何以傻瓜式的方式操作吗?

    2012年2月8日 11:02

    1. Jean-Yves Perrier

      Mei,这与两位数问题无关,因为可能只有几个网站会显示弹出窗口或类似内容。我建议您访问支持网站,例如 http://support.mozilla.org

      他们将能够帮助您诊断问题。

      2012年2月10日 10:57

  12. Herbert Peters

    FF 10.0 运行良好。FF 10.0.1 使我们其中一个网站失效。版本被错误地截断为 0.1 而不是 10.0。

    2012年2月10日 21:46

  13. Chas4

    这在 3 年前就影响了 Opera。

    10 是关键
    http://my.opera.com/hallvors/blog/2008/12/19/10-is-the-one

    2012年2月11日 10:08

    1. Jean-Yves Perrier

      Opera 10 发布时并没有使用您链接的文章中描述的用户代理。他们将版本号保留为 Opera/9.80 并添加了 Version/10.00(这是新的版本号)。

      请参阅:http://dev.opera.com/articles/view/opera-ua-string-changes/

      2012年2月14日 05:07

  14. Phil Pishioneri

    具有讽刺意味的是,此网页右侧的“按类别查看文章”将“Firefox 10”列在“Firefox 3.5”之前。

    2012年2月13日 17:08

    1. Chris Heilmann

      哈哈!排序与自然排序的风险:) 观察得很好。

      2012年2月15日 04:07

  15. anggel

    http://my opera.com/hallvors/blog/2008/19/10-is-the-one

    2012年2月14日 04:55

  16. Pete

    我的担忧是,卡巴斯基虚拟键盘与 Duckduckgo 一样有效。
    我不得不卸载 Mozilla/Firefox 升级并重新安装一个兼容的旧版本。此新升级是否兼容?

    2012年2月14日 11:55

    1. Jean-Yves Perrier

      问题是反过来的:必须兼容的是卡巴斯基虚拟键盘。您是否咨询过卡巴斯基支持?

      至于 Duckduckgo,它运行得非常完美,并且在任何版本的 Firefox 中我从未遇到过任何问题。

      2012年3月1日 00:47

  17. Zafar Al Masood

    在某些文本字段中,我使用条形码扫描仪输入时,在 Firefox 浏览器中会出现一个下载窗口。尽管条形码扫描仪充当键盘输入设备,但它不应显示下载窗口。我在 Firefox 浏览器中阻止了下载选项(工具->选项->常规选项卡->取消选中下载选项),但没有任何反应,即使我禁用了 JavaScript。条形码扫描仪输入时,Firefox 浏览器中仍然会出现下载窗口。

    IE(任何版本)都没有显示此问题。我该怎么办?谁能帮我?我正在开发一个依赖于浏览器的 ERP 系统。我安装了最新的 Firefox..直到 Goom ma gooma.. ahaaa..

    2012年2月18日 02:12

    1. Jean-Yves Perrier

      此博客不适合作为支持论坛(尤其是在与文章主题无关的问题上)。您应该在 http://support.mozilla.org 上解释您的问题,在那里人们会帮助您诊断问题并最终填写错误报告。无论如何,从安全模式开始,看看问题是否仍然存在,将是第一个要进行的测试。

      2012年2月18日 02:16

  18. joe

    哦,我的天,真是太搞笑了!令人难过的是,如此多的脚本编写者编写了糟糕的代码。有没有人听说过正则表达式?/d+(.d+)?/ 这并不难,对吧?您可以在 JS、Java、PHP、ASP……任何地方执行它。简而言之,这仅仅是业余的、考虑不周的代码毫无意外地失败的情况。

    2012年2月22日 11:41

    1. Jean-Yves Perrier

      编写在所有情况下都能正常工作的 UA 检测远非易事。

      请注意,您的正则表达式将匹配用户代理字符串中不仅仅是 Firefox/Gecko 版本号的内容。用户代理中还有其他数字,而不是版本号。特别是,每次都会有日期与您的正则表达式匹配。

      2012年3月1日 00:52

本文的评论已关闭。