使用 User-Agent 客户端提示检测Windows 11和 CPU 体系结构

网站可以使用User-Agent客户端提示 (UA-CH) 来区分Windows 11用户和Windows 10用户,并检测设备的 CPU 体系结构。 浏览器使用User-Agent客户端提示格式向网站提供用户代理信息。

网站还可以使用从浏览器发送的用户代理信息来检测如下信息:

  • 浏览器品牌。
  • 浏览器版本号。
  • 运行浏览器的设备平台。

站点可通过两种方法访问用户代理信息:

  • (旧) User-Agent字符串。
  • 建议) (User-Agent客户端提示。

有关这两种方法的详细信息,请参阅 从网站检测 Microsoft Edge

在 Microsoft Edge (和 Google Chrome) 中,站点可以通过User-Agent客户端提示 (UA-CH) 来区分Windows 11和Windows 10上的用户,并检测设备的 CPU 体系结构。 可以在以下 UA-CH 请求标头中找到此信息:

标头字段 指示Windows 10的值 指示Windows 11的值
Sec-CH-UA-Platform Windows Windows
Sec-CH-UA-Platform-Version 和 之间的 1.0.010.0.0 13.0.0 及更高版本

User-Agent字符串不会更新为区分Windows 11和Windows 10,也不会区分 CPU 体系结构。 建议不要使用User-Agent字符串来检索用户代理数据。 不支持User-Agent客户端提示的浏览器将无法区分Windows 11和Windows 10,也无法区分 CPU 体系结构。

支持User-Agent客户端提示的浏览器

下表显示了哪些浏览器支持区分Windows 11和Windows 10,以及不同的 CPU 体系结构。

浏览器 支持通过User-Agent客户端提示进行区分?
Microsoft Edge 94+
Chrome 95+
Opera
Firefox
Internet Explorer 11

用于检测Windows 11的示例代码

以下代码检测Windows 11:

navigator.userAgentData.getHighEntropyValues(["platformVersion"])
 .then(ua => {
   if (navigator.userAgentData.platform === "Windows") {
     const majorPlatformVersion = parseInt(ua.platformVersion.split('.')[0]);
     if (majorPlatformVersion >= 13) {
       console.log("Windows 11 or later");
      }
      else if (majorPlatformVersion > 0) {
        console.log("Windows 10");
      }
      else {
        console.log("Before Windows 10");
      }
   }
   else {
     console.log("Not running on Windows");
   }
 });

用于检测 ARM 或 x86 的示例代码

使用 CPU 体系结构检测让网站自动下载专为用户 CPU 生成的应用版本。

CPU 检测对于基于 ARM 的设备特别有用,因此使用 ARM 设备的客户会自动下载应用程序的本机 ARM 版本。 这可以防止用户无意中安装为 x86 生成的应用,然后因仿真而降低性能。

以下代码检测 CPU 体系结构:

navigator.userAgentData.getHighEntropyValues(["architecture", "bitness"])
 .then(ua => {
   if (navigator.userAgentData.platform === "Windows") {
     if (ua.architecture === 'x86') {
       if (ua.bitness === '64') {
         console.log("x86_64");
       }
       else if (ua.bitness === '32') {
         console.log("x86");
       }
     }
     else if (ua.architecture === 'arm') {
       if (ua.bitness === '64') {
         console.log("ARM64");
       }
       else if (ua.bitness === '32') {
         console.log("ARM32");
       }
     }
   }
   else {
     console.log("Not running on Windows");
   }
 });

使用 优化检测性能 Critical-CH

目前,网站服务器必须将响应标头发送到 Accept-CH 浏览器客户端,以请求默认情况下未在标头中 Sec-CH-UA 发送的较高 entropy 字段。 下图显示了浏览器向服务器发送请求标头,包括 user agent: <UA string> 和接收响应标头,包括 Accept-CH: sec-ch-ua-platform

仅使用 Accept-CH 标头的请求

在此初始请求期间,客户端将记录 Accept-CH 首选项,并在后续请求中默认包括 sec-ch-ua-platform

为了进一步优化此流,除了标头之外Accept-CH,还可以使用新的Critical-CH标头来立即重新发出请求标头,而无需重新加载页面。 下图显示了浏览器向服务器发送请求标头,包括 user agent: <UA string> 和 接收响应标头,包括 Accept-CH: sec-ch-ua-platformCritical-CH: sec-ch-ua-platform。 然后,浏览器立即将请求标头发送到服务器。

使用 Critical-CH 和 Accept-CH 标头的请求

从 Microsoft Edge 版本 96 开始,可以使用新 Critical-CH 标头接收具有优化性能的所需高 entropy 标头。

请记住, Critical-CH 在清除会话 Cookie 或用户清除给定来源的站点数据或 Cookie 之前,和 Accept-CH 首选项将一直保留。 有关 的详细信息 Critical-CH,请参阅 客户端提示可靠性

检测特定 Windows 版本

用户代理客户端提示草稿社区组报告中指定了navigator.userAgentData.getHighEntropyValues由提示"platformVersion" (API 返回的平台版本定义,Sec-CH-UA-Platform-Version并通过标头) 。 在 Windows 10 及更高版本中,该值基于 Windows.Foundation.UniversalApiContract 版本

若要检测特定版本的 Windows,请在 User-Agent 客户端提示中使用以下值 platformVersion

版本 的第一个版本组件 platformVersion
Win7/8/8.1 0
Win10 1507 1
Win10 1511 2
Win10 1607 3
Win10 1703 4
Win10 1709 5
Win10 1803 6
Win10 1809 7
Win10 1903 8
Win10 1909 8
Win10 2004 10
Win10 20H2 10
Win10 21H1 10
Win10 21H2 10
Win11 13+