移动端网页 UA 字符串被截断后如何获取完整设备型号
当浏览器启用 UA reduction 后,User-Agent 头部会移除设备型号等隐私信息,此时应通过 Sec-CH-UA-Model 请求头获取。
检查 User-Agent 头部是否包含设备型号
在移动端网页开发中,若发现 User-Agent 头部中不再显示具体的设备型号(如 Pixel 9),这通常是因为浏览器启用了 User-Agent reduction 功能。该功能旨在减少隐私敏感信息,因此会自动移除设备型号、操作系统版本以及次要浏览器版本号。此时,服务器接收到的头部信息会变得通用化,例如显示为 Android 10; K,而不是具体的 Android 16; Pixel 9。这会导致依赖 UA 字符串进行设备识别的代码失效。
要确认是否处于 UA reduction 状态,可以在网络请求中查看 User-Agent 头部的具体内容。如果发现原本详细的版本号和型号被替换为固定的通用值,说明该浏览器已应用了隐私保护策略。这种变化意味着传统的 UA 字符串已不再包含用于区分特定设备的唯一标识信息,因此必须采用新的机制来获取这些数据。
使用 Sec-CH-UA-Model 请求头获取设备型号
为了在 UA reduction 生效的情况下仍然获取设备型号,可以使用 Sec-CH-UA-Model 请求头。该请求头属于 User-Agent Client Hints 的一部分,允许服务器在客户端明确请求的情况下,获取更详细的设备信息。与 UA 字符串不同,Client Hints 是通过显式请求的方式传递数据,从而在保护隐私的同时提供必要的设备识别能力。
在发送 HTTP 请求时,需要在请求头中包含 Sec-CH-UA-Model 字段。浏览器会根据用户的隐私设置和网站的权限策略,决定是否返回该字段的值。如果请求成功,服务器将收到具体的设备型号信息,从而解决了 UA reduction 导致的信息缺失问题。
通过 JavaScript NavigatorUAData 接口读取设备信息
除了在 HTTP 请求头中获取设备信息,还可以通过 JavaScript 的 NavigatorUAData 接口在客户端读取低熵的设备提示信息。Navigator.userAgentData 属性提供了 NavigatorUAData 对象,其中包含了基本的设备类型和品牌信息。这允许前端代码在不依赖 UA 字符串的情况下,获取必要的上下文信息。
如果需要获取更高熵值的设备信息,例如具体的设备型号或表单因子,可以使用 NavigatorUAData.getHighEntropyValues() 方法。该方法需要传入一个包含所需提示名称的数组,例如 ['model', 'formFactor']。调用成功后,返回的对象中将包含这些详细的设备数据,从而为网页提供更精准的设备识别能力。
验证获取结果是否准确
验证获取结果的方法是在浏览器开发者工具的 Network 面板中查看请求头,确认 Sec-CH-UA-Model 字段是否已发送并返回了预期的设备型号值。同时,在 Console 控制台执行 Navigator.userAgentData.getHighEntropyValues(['model']),检查返回的 model 属性是否与实际设备相符。如果两者一致,说明已成功绕过 UA reduction 限制,获取到了完整的设备信息。
如果发现请求头中未包含 Sec-CH-UA-Model,或者 JavaScript 返回的值为空,可能是因为浏览器的隐私设置阻止了信息共享,或者网站未正确配置 Client Hints 权限。此时应检查浏览器的隐私设置,确保允许该网站访问设备信息,并在服务器端正确配置 Accept-CH 请求头以响应客户端的提示请求。
资料与延伸阅读
你可以通过以下原始资料核对文中概念,并继续深入阅读。