HTTP 客户端提示

客户端提示是一组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响应头如何,具体取决于权限策略。这些提示包括:Save-DataSec-CH-UASec-CH-UA-MobileSec-CH-UA-Platform

高熵提示是指有可能泄露更多可用于用户指纹的信息的提示,因此,它们以用户代理可以决定是否提供它们的方式进行限制。该决定可能基于用户偏好、权限请求或权限策略。所有不是低熵提示的客户端提示都被视为高熵提示。

关键客户端提示

关键客户端提示是指应用响应可能会显着改变渲染页面,可能以令人不快的方式或会影响可用性的方式,因此必须在内容渲染之前应用。例如,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-*头的列表,请参阅用户代理客户端提示头

客户端提示可通过用户代理客户端提示 API供网页 JavaScript 使用。

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

注意:用户代理客户端提示在围栏框架内部不可用,因为它们依赖于权限策略委托,这可能被用来泄露数据。

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

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

设备客户端提示

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

网络客户端提示

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

另请参阅