历史
User-Agent: <something>
是 HTTP 客户端(浏览器、机器人、日历应用程序等)发送到服务器的每个 HTTP 请求的字符串。1991 年定义的 HTTP 协议 中没有此字段,但1992 年定义的下一个版本 在 HTTP 请求头中添加了User-Agent
。它的语法定义为“软件产品名称,可选斜杠和版本标识符
”。这段文字已经邀请人们将其用于分析和识别具有实现问题的产品。
如果存在,这行代码将给出原始客户端使用的软件程序。这是为了统计目的以及跟踪协议违规行为。它应该被包含在内。
快进到 2013 年 8 月,HTTP/1.1 规范正在修订,并且也定义了User-Agent
。
用户代理不应生成包含
不必要的细粒度细节的 User-Agent 字段,并且应限制添加
第三方子产品。过长和详细的 User-Agent
字段值会增加请求延迟,并增加用户被
识别违背其意愿的风险(“指纹识别”)。同样,鼓励实现不要使用其他实现的产品
标记来声明与它们的兼容性
,因为这会规避该字段的目的。如果用户
代理伪装成不同的用户代理,接收方可以假设
用户有意希望看到为
该标识的用户代理量身定制的响应,即使它们可能不适合
实际使用的用户代理。
基本上,HTTP 规范从一开始就劝阻检测User-Agent
字符串来定制用户体验。目前,用户代理字符串已经变得过长。它们以各种可能的方式被滥用。它们包含详细的信息。它们对自己的真实身份撒谎,并且用于宣传和广告它们运行的设备。
用户代理检测
用户代理检测(或嗅探)是用于解析User-Agent
字符串并推断有关设备及其浏览器的物理和应用程序属性的机制。但让我们把记录摆正。用户代理嗅探是一种未来失败策略。从设计上来说,你只会检测到已知的东西,而不会检测到将来的东西。小型设备(智能手机、功能手机、平板电脑、手表、Arduino 等)的空间是一个发展非常快的空间。物理特性方面的多样性只会增加。更新用于正确识别的数据库和算法是一项非常高维护的任务,它注定会在将来的某个时刻失败。网站会被放弃,库得不到维护,网站会崩溃,仅仅因为它们没有为未来的设备做好计划。所有这些都会造成资源和品牌成本。
正在开发新的解决方案来帮助人们调整用户体验,根据产品的功能,而不是它的名称。响应式设计有助于创建适应不同屏幕尺寸的网站。每次检测到产品或功能时,都要彻底了解为什么要尝试检测此功能。你可能会陷入与用户代理检测算法中存在的陷阱相同的陷阱。
我们每天都要处理滥用用户代理检测来屏蔽 Firefox OS 和/或 Android 上的 Firefox 的情况。不仅是 Mozilla 产品,每个产品和品牌都必须在某个时刻处理被排除在外的事实,因为它们没有通过错误编码的算法所需的正确标记。用户代理检测会导致这种情况,即即使新玩家拥有正确的技术集,也很难进入市场。请记住,创建一个对多种情况具有弹性的系统,具有巨大的优势。
有些公司会使用User-Agent
字符串作为标识符,来绕过付费墙或在营销活动期间为一组用户提供特定内容。乍一看,这似乎是一个简单的解决方案,但它会创建一个易于通过欺骗用户代理来绕过的环境。
Firefox 和移动
Firefox OS 和 Android 上的 Firefox 具有非常简单且有文档记录的User-Agent
字符串。
Firefox OS
Mozilla/5.0 (Mobile; rv:18.0) Gecko/18.0 Firefox/18.0
Android 上的 Firefox
Mozilla/5.0 (Android; Mobile; rv:18.0) Gecko/18.0 Firefox/18.0
用户代理检测的最常见情况是了解设备是否为移动设备,以便将浏览器重定向到专门为移动内容量身定制的网站。我们建议你将检测限制为尽可能简单的字符串,通过匹配小写字母mobi
子字符串。
/mobi/i
如果你是使用 JavaScript 在客户端进行检测,那么众多可能性之一就是执行
// Put the User Agent string in lowercase
var ua = navigator.userAgent.toLowerCase();
// Better to test on mobi than mobile (Firefox, Opera, IE)
if (/mobi/i.test(ua)) {
// do something here
} else {
// if not identified, still do something useful
}
你可能希望在if
语句中添加多个标记。
/mobi|android|touch|mini/i.test(ua)
请记住,无论你在那里放了多少标记,你都会在将来的某个时刻失败。有些设备没有 JavaScript,没有正确的标记。标记的模式或长度与你最初计划的不一致。道路上的石头很多,选择简单的道路。
总结:UA 检测清单禅宗
- 不要检测用户代理字符串
- 为你的新移动网站使用响应式设计(媒体查询)
- 如果你正在使用特定功能,请使用功能检测来增强,而不是屏蔽
- 最后,如果你正在使用 UA 检测,只使用最简单和通用的字符串。
- 始终提供有效的回退,无论你选择了什么解决方案。
实践。学习。想象。修改。然后重新开始。根据你的公司背景、业务需求、社会基础设施,道路上会有很多障碍。请将这份清单放在你身边,让更多人使用 Web。
关于 Robert Nyman [名誉编辑]
Mozilla Hacks 的技术布道者和编辑。发表关于 HTML5、JavaScript 和开放网络的演讲和博客文章。Robert 坚定地相信 HTML5 和开放网络,自 1999 年以来一直从事 Web 前端开发工作 - 在瑞典和纽约市。他还定期在http://robertnyman.com 上写博客,喜欢旅行和结识新朋友。
24 条评论