HTTP 客户端提示

客户端提示(Client hints)是一组 HTTP 请求头字段,服务器可以主动向客户端请求这些字段,以获取有关设备、网络、用户以及用户代理特定偏好的信息。服务器可以根据客户端选择提供的信息来确定发送哪些资源。

“提示”头字段集合列在 HTTP 头字段主题中,并在下面进行了总结

概述

服务器必须使用 Accept-CH 头字段来宣布它支持客户端提示,指定它感兴趣接收的提示。当支持客户端提示的客户端收到 Accept-CH 头字段时,它可以选择在其后续请求中附加部分或全部列出的客户端提示头字段。

例如,在下面的响应中跟随 Accept-CH 之后,客户端可以在所有后续请求中附加 WidthDownlinkSec-CH-UA 头字段。

http
Accept-CH: Width, Downlink, Sec-CH-UA

这种方法是高效的,因为服务器只请求它能够有效处理的信息。它也相对“保护隐私”,因为由客户端决定可以安全共享哪些信息。

有一小部分低熵客户端提示头字段,即使未请求,客户端也可能发送。

注意:客户端提示也可以通过在 HTML 中使用带有 http-equiv 属性的 <meta> 元素来指定。

html
<meta http-equiv="Accept-CH" content="Width, Downlink, Sec-CH-UA" />

缓存与客户端提示

决定响应中发送哪些资源的客户端提示通常也应该包含在受影响响应的 Vary 头字段中。这确保了为提示头字段的每个不同值缓存不同的资源。

http
Vary: Accept, Width, ECT

对于值经常变化的客户端提示头字段,您可能更倾向于省略指定 Vary 或使用其他策略,因为这实际上会使资源不可缓存。(为每个唯一值创建一个新的缓存条目。)这尤其适用于网络客户端提示,如 DownlinkRTT。有关更多信息,请参阅 HTTP 缓存 > Vary

提示生命周期

服务器在 Accept-CH 响应头中指定它感兴趣的客户端提示头字段。用户代理将请求的客户端提示头字段(或至少是它希望与该服务器共享的子集)附加到当前浏览会话中的所有后续请求中。

换句话说,对特定提示集的请求在浏览器关闭之前不会过期。

服务器可以通过重新发送带有新列表的 Accept-CH 响应头来替换它感兴趣接收的客户端提示集。例如,要停止请求任何提示,它将发送带有空列表的 Accept-CH

注意:特定源的客户端提示集也可以通过发送针对该源内部 URL 的 Clear-Site-Data: "clientHints" 响应头来清除。

低熵提示

客户端提示大致分为高熵提示和低熵提示。低熵提示是那些不会泄露太多可能用于为用户创建指纹的信息的提示。根据权限策略,它们可能默认在每个客户端请求中发送,无论服务器 Accept-CH 响应头如何。低熵提示有:

高熵提示

高熵提示是那些有可能泄露更多可用于用户指纹识别的信息的提示,因此受到限制,用户代理可以决定是否提供它们。该决定可能基于用户偏好、权限请求或权限策略。所有非低熵提示的客户端提示都被认为是高熵提示。

关键客户端提示

关键客户端提示是指应用响应可能会显著改变渲染页面,可能以令人不适或影响可用性的方式,因此必须在内容渲染之前应用。例如,Sec-CH-Prefers-Reduced-Motion 通常被视为关键提示,因为它可能会显著影响动画的行为,并且选择此偏好的用户需要将其设置好。

服务器可以使用 Critical-CH 响应头与 Accept-CH 一起指定一个被接受的客户端提示也是一个关键客户端提示(Critical-CH 中的头字段也必须出现在 Accept-CH 中)。接收带有 Critical-CH 响应的用户代理必须检查原始请求中是否发送了指示的关键头字段。如果未发送,则用户代理将重试请求而不是渲染页面。此方法确保即使未包含在第一个请求中,或者服务器配置发生更改,使用关键客户端提示设置的客户端偏好也始终会被使用。

例如,在这种情况下,服务器通过 Accept-CH 告诉客户端它接受 Sec-CH-Prefers-Reduced-Motion,并且 Critical-CH 用于指定 Sec-CH-Prefers-Reduced-Motion 被视为关键客户端提示。

http
HTTP/1.1 200 OK
Content-Type: text/html
Accept-CH: Sec-CH-Prefers-Reduced-Motion
Vary: Sec-CH-Prefers-Reduced-Motion
Critical-CH: Sec-CH-Prefers-Reduced-Motion

注意:我们还在 Vary 头字段中指定了 Sec-CH-Prefers-Reduced-Motion,以指示浏览器所提供的内容将根据此头字段值而不同,即使 URL 保持不变,因此浏览器不应仅仅使用现有的缓存响应,而应单独缓存此响应。Critical-CH 头字段中列出的每个头字段也应出现在 Accept-CHVary 头字段中。

由于 Sec-CH-Prefers-Reduced-Motion 是一个关键提示,且未包含在原始请求中,客户端会自动重试请求——这次通过 Sec-CH-Prefers-Reduced-Motion 告诉服务器它对减少运动动画有用户偏好。

http
GET / HTTP/1.1
Host: example.com
Sec-CH-Prefers-Reduced-Motion: "reduce"

提示类型

用户代理客户端提示

用户代理(UA)客户端提示头字段允许服务器根据用户代理(浏览器)、操作系统和设备来改变响应。有关 Sec-CH-UA-* 头字段的列表,请参阅用户代理客户端提示头字段

客户端提示可通过 User Agent Client Hints API 供网页 JavaScript 使用。

注意:服务器目前通过解析 User-Agent 头字段获取大部分相同的信息。由于历史原因,此头字段包含大量基本不相关的信息,以及可能用于识别特定用户的信息。UA 客户端提示提供了一种更高效、更保护隐私的方式来获取所需信息。它们最终有望取代这种旧方法。

注意:用户代理客户端提示在 Fenced Frames 内不可用,因为它们依赖于 Permissions Policy 委托,这可能导致数据泄露。

用户偏好媒体特性客户端提示

用户偏好媒体特性客户端提示允许服务器根据用户代理对 CSS 媒体特性(例如颜色方案或减少运动)的偏好来改变响应。头字段包括:Sec-CH-Prefers-Reduced-MotionSec-CH-Prefers-Color-Scheme

设备客户端提示

设备客户端提示允许服务器根据设备特性(包括可用内存和屏幕属性)来改变响应。头字段包括:Device-MemoryWidthViewport-Width

网络客户端提示

网络客户端提示允许服务器根据用户的选择、网络带宽和延迟来改变响应。头字段包括:Save-DataDownlinkECTRTT

另见