看到这样的标题,你就会知道这篇文章很有趣。(不,说真的。)
用户代理字符串是那些奇妙的、不拘一格的东西之一,它是现代性和古老性的平衡。除了大部分偏向于古老性。它多年来一点一点地发展;因为每个人都有自己解析它的特殊方式,所以它是一个臭名昭著的敏感的东西。向其中添加内容相对简单,但删除或重新排列部分内容则不然。
如果您是 Web 开发人员并且依赖于 UA 字符串中的部分内容,那么这篇文章绝对适合您。碰巧的是,Internet Explorer 9 的 UA 字符串经过了一些修改,微软最近宣布了 IE Mobile 的字符串。这使得时机成熟,可以进行修订,以便 Web 开发人员可以一次性对嗅探代码进行必要的更改。
这是 32 位 Windows 上 Firefox 4 的用户代理字符串的样子
请注意,此字符串将根据用户环境、平台和架构而变化。尤其重要的是要理解,根据您是在手机上、在 Windows 上、在 64 位 Windows 上、在 Mac 上还是在各种基于 Linux 的设备上,字符串可能会发生很大变化。
此外,Firefox 使用的底层浏览器平台 Gecko 被用作许多其他产品的基础。这些产品可能会生成类似 Firefox 的字符串,您应该做好处理它们的准备,并像对待 Firefox 一样对待它们。(有关更多详细信息,请参见下文。)如果您正在嗅探 UA 字符串,则应仔细考虑您想要实现的目标,以及您是否可以改为嗅探功能。请参阅 这篇优秀的文章,以获取有关如何执行此操作的一些建议。
有关完整参考,请参阅 Gecko 用户代理字符串参考。还有一个 文本文件 可以用来测试,其中包含大量新旧版本的 Firefox 和其他基于 Gecko 的浏览器的 UA 字符串。
以下是自 Firefox 3.6 以来发生变化的内容列表
1) 地区设置(例如 “en-US;”)已消失。浏览器的地区设置并不总是与用户希望查看内容的地区设置相同——HTTP Accept 标头是此信息的推荐来源。
2) “U;” 已消失。在过去,它用于区分具有强加密的浏览器和没有强加密的浏览器。如今,没有浏览器附带弱加密。这意味着,如果您正在嗅探 “U;”,则应停止这样做,或者——如果必须——嗅探缺少强加密 (“I;” 或 “N;”)。
3) “Windows;” 前缀已从(令人惊讶的!)Windows 特定字符串中删除。请注意,平台令牌中分号分隔的字段数量在不同的平台之间有所不同!
4) 在诺基亚移动 Maemo(和 Meego)平台上运行的浏览器现在将自身报告为 “(Maemo; Linux armv7l; …)”。这与 Android 移动字符串 “(Android; Linux armv7l; …)” 保持一致,并且随着更多 Linux 平台的使用,我们将继续在此处添加不同的字符串。
5) 一个相当小的细节,但值得注意——对于在 x86_64 平台上运行的 Linux i686 版本,平台特定部分现在将显示为 “(X11; Linux i686 on x86_64; rv:…)”。它已从 “(X11; Linux i686 (x86_64); rv:…)” 更改。(嵌套括号不是一个好主意!)
6) “Gecko/yyyymmdd” 令牌中的 Gecko 构建日期已针对 Firefox 版本固定为 20100101。这意味着
- 如果您想检测浏览器是否是真正的 Gecko,请搜索字符串 “Gecko” 和 “rv:”。这两个字符串的存在将区分 Gecko 与在 UA 字符串中声明为 “like Gecko” 的浏览器。
- 如果您想确定 Gecko 版本,首先——如上所述——仔细考虑您是否可以改为嗅探功能。如果必须,请从 “rv:x.y.z” 字符串中获取它。
如果您目前正在使用构建日期或以其他方式依赖于 “Gecko/yyyymmdd” 令牌的确切格式,请停止!在 Gecko 的下一个主要版本中,这将被字符串 “Gecko/” 替换。如果您依赖于它后面会跟着日期字符串这一事实,那么您将导致故障。
出于测试目的,未固定的构建日期仍包含在 Firefox 的夜间版本中,但将在未来的夜间版本中删除。
7) 对于除 Firefox 之外的基于 Gecko 的浏览器,它们识别自己的方式发生了变化。例如,这就是 Firefox 的移动版本 Fennec 的样子
- Firefox 令牌。这是一个兼容性令牌,某些基于 Gecko 的浏览器将使用它;例如,Fennec 和 Camino(适用于 Mac)希望看起来像 Firefox,以最大限度地与网站兼容。(字符串的版本部分通常代表与给定 Gecko 版本相对应的 Firefox 版本。)现在,这是一个可选令牌,一些基于 Gecko 的浏览器可能不会选择使用它。因此,嗅探器应该查找 Gecko——而不是 Firefox!对于 Firefox 本身和其他未选择加入的浏览器,此令牌将不会出现,因为它由
- 应用程序处理。对于 Firefox 本身,这将类似于 “Firefox/4.0.1”,或者 “Fennec/2.0.1”,或者 “Camino/2.1.1”。此外,Firefox 的测试版本(Minefield 夜间版本和预发布版本)现在将识别为 Firefox 而不是 Minefield。
还值得注意的是,我们为什么没有更改某些内容。Linux 字符串中的 “X11” 部分可能看起来是多余的,但实际上并非如此:台式机几乎完全运行 X11,但 Android 手机则不然,而 Maemo(虽然基于 X11)应该区分开来。出于这样的原因,字符串的各个平台特定部分非常重要:Windows 64 上的 x64 或 WoW64(64 位 Windows 上的 32 位浏览器)有不同的令牌;Mac OS X 上的 PPC 或 Intel;以及 Linux 的各种环境和架构。以下是一些不同平台上各种基于 Gecko 的浏览器的示例
Mozilla/5.0 (Windows NT 5.2; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Mozilla/5.0 (WindowsCE 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Mozilla/5.0 (Windows NT 6.0; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre
Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Mozilla/5.0 (X11; Linux i686 on x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1
Mozilla/5.0 (X11; Linux i686; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre
Mozilla/5.0 (Android; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1
Mozilla/5.0 (Android; Linux armv7l; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre Fennec/2.0b1pre
Mozilla/5.0 (Maemo; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1
Mozilla/5.0 (X11; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1
Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1
Mozilla/5.0 (X11; Linux i686 on x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1
Mozilla/5.0 (X11; Linux i686; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre Fennec/2.0b1pre
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Camino/2.2.1
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre Camino/2.2a1pre
还有一些其他重要的更改与 UA 字符串如何被外部程序、Firefox 插件和用户自己修改有关。这些更改将在另一篇文章中详细介绍,但结果是您在这里看到的字符串就是您在现实世界中看到的字符串。
现在,如果您是 Web 开发人员,请注意!所有这些更改都将在 Firefox 4 Beta 6(即将发布)中出现,因此,如果您想领先一步,欢迎您对其进行测试。如上所述,有关所有这些辉煌变化的 UA 字符串的完整列表,请参阅 上面的链接 和 文本文件。嗅探愉快!
47 条评论