Accept-Language Reduction(接受语言减少)旨在减少 Accept-Language
标头中的用户语言偏好设置,并且仅发送用户最偏好的语言(仅发送一种),从而减少被动数字“指纹”收集。
从 Chrome 109 Beta 版开始,我们将开放 Accept-Language Reduction 的源试用,让网站可以选择接收经过缩减的 Accept-Language
标头。这样,网站就可以在未来版本中发现并修复问题,然后简化的 Accept-Language
将成为 Chrome 中的默认行为。如需在面向稳定用户发布之前测试该功能,请务必在 Chrome 109(目前预定于 2023 年 1 月 10 日)发布日期之前选择加入并进行测试。
下面是缩减前后的 Accept-Language
标头示例。
Accept-Language: en-GB,en;q=0.9,de;q=0.8,fr;q=0.7
Accept-Language: en-GB
下面概述了源试用和后续影响。您可以在 Accept-Language Reduction GitHub 代码库中分享您对此更改的反馈或您在源试用期间遇到的任何问题的反馈。
什么是 Accept-Language?
Accept-Language 字符串在每个 HTTP 请求中共享,并在 JavaScript 中提供给浏览器加载的所有资源。目前,它包含用户的所有首选语言。
为什么 Accept-Language 减少了?
接受语言减少是一项功能,旨在减少 Chrome 中的被动数字“指纹”收集。
目前,默认情况下,每个 HTTP 请求都会共享 Accept-Language
标头,并在 JavaScript 中向浏览器加载的所有资源公开。它包含用户的所有语言偏好设置。我们将引入一种新方式让网站指示多语言内容,然后浏览器将负责进行语言协商并显示首选语言,而不是让浏览器发送用户已配置的完整语言列表,以防网站希望提供多语言内容。
另一个原因是,许多网站可能根本不会使用 Accept-Language
标头进行语言协商(例如,一项研究表明,前 10,000 个网站中只有 7.2% 使用 Accept-Language
)。Chrome 无痕模式已将 Accept-Language
减少到 1。
这对 Web 开发者有什么影响?
依赖 Accept-Language
进行语言协商的网站应做好接收 Accept-Language
折扣的准备,并考虑参与源试用。缩减的Accept-Language
值将显示在:
Accept-Language
HTTP 请求标头。navigator.languages
JavaScript getter。
浏览器将负责语言协商,以选择要发送到网站的用户首选语言。为此,网站需要在响应标头中添加两个标头 Variants
(新标头指示网站支持语言)Accept-Language
和 Content-Language
(请参阅下面的详细示例)。
简化版 Accept-Language
方案目前不包含 iOS 和 WebView,这些平台将继续获取用户的完整 Accept-Language
列表。我们计划在以后支持这些平台。
接受 - 语言减少的源试用
源试用要求参与网站在其响应中提供令牌,以告知浏览器启用指定的试用。不过,这意味着,在浏览器向网站发出初始请求时,无法得知网站是否在参与源试用。这意味着会话中的初始请求不会发送经过缩减的 Accept-Language header
。针对该页面中的子资源(包括同源和跨源子资源)的请求将收到缩短的 Accept-Language
标头。后续同源导航也将收到缩减的 Accept-Language
标头。跨源导航将还原为发送完整的标头,而如果顶级框架请求具有有效的源试用令牌,则网页内的跨源请求(例如第三方 iframe 请求)仍会发送缩减的 Accept-Language
标头。
这类似于用户代理缩减源试用,如果您想详细了解内部 Chromium 实现,可以参阅实现 Reduce Accept-Language HTTP 标头了解详情。
参与 Accept-Language Reduction 源试用
您可以阅读 Chrome 源试用使用入门中的进一步指南,但基本步骤如下所示。
第 1 步
如需注册源试用并获取网域令牌,请访问试用以减少接受语言页面。
第 2 步
更新您的 HTTP 响应标头:
- 将
Origin-Trial: <ORIGIN TRIAL TOKEN>
添加到 HTTP 响应标头,其中 <ORIGIN TRIAL TOKEN
> 包含您在注册源试用时获得的令牌。 - 将
Content-Language
添加到 HTTP 响应标头,以指明面向受众群体的语言。 - 将
Variants
添加到 HTTP 响应标头,以指明网站支持的语言。 - [可选] 将
Vary: Accept-Language
添加到您的 HTTP 响应中,以创建用于内容协商的缓存键。 - 设置这些标头仅会为给定源触发浏览器语言协商(初始请求可能会重启)。为了让网站向用户显示正确的语言表示形式,您还需要根据用户的 Accept-Language 标头更新发送内容的网站(参见下面的示例)。
第 3 步
在 Chrome M109 Beta 版(或更高版本)中加载您的网站,并开始接收缩减的 Accept-Language 字符串。
将任何问题或反馈提交到 Accept-Language Reduction GitHub 代码库。
演示
如需查看已选择启用源试用的多语言网站(以及源代码)的演示,请参阅 https://reduce-accept-language.glitch.me/。
如需查看选择启用和停用源试用的演示(以及源代码),请参阅 https://reduce-accept-language-ot.glitch.me/。
例如,example.com
支持 ja
(日语)和 en
(英语)。请求可以是:
GET / HTTP/1.1
Host: example.com
Accept-Language: en
网站根据用户接受的语言,了解到用户更喜欢英语内容。响应标头可能包含以下内容:
HTTP/1.1 200 OK
Content-Language: en
Variants: Accept-Language=(en ja)
Origin-Token: a-valid-token
如果用户偏好日语内容,则请求为:
GET / HTTP/1.1
Host: example.com
Accept-Language: ja
在这种情况下,该网站会返回日语内容的标头:
HTTP/1.1 200 OK
Content-Language: ja
Variants: Accept-Language=(en ja)
Origin-Token: a-valid-token
在服务器端,网站可能会寻找特定语言支持,但如果系统未检测到支持,则会回退到默认语言:
if(accept_language == 'ja') {
res.response('ja_page')
}
else {
res.response('en_page')
}
在上面的示例中,example.com
会根据 Accept-Language
值响应 en
或 ja
,如果没有匹配项,则默认为 en
。在这种情况下,网站还可以根据 Accept-Language
值提供指向相应语言页面的 /en
或 /ja
重定向。如需查看与重定向相关的详细示例,请参阅实现文档。
第三方源试用支持
我们目前不支持将您的域名注册为试用第三方。如果您运营的服务在各个源站(例如广告投放或 Google Analytics [分析])中作为子资源实现,则只有在顶级网站参与源试用时,您才会收到简化的 Accept-Language
标头。
验证源试用是否正常运行
Chrome 源试用问题排查指南提供了一份完整的核对清单,用于确保令牌配置正确。
您可以通过 chrome://settings/languages
或“设置”→“语言”配置多种语言及其优先级。请考虑选择您的网站不支持的语言,并将其移至列表顶部,以确保触发额外的重新协商。
包含源试用令牌的初始响应标头应如下所示:
包含简化的 Accept-Language 的后续请求标头如下所示:
停止参与源试用
在试用期间的任何给定时间点,您都可以停止参与,并接收用户 Accept-Language 的完整列表。要停止参与,请执行以下操作:
- 从 HTTP 响应中移除 Accept-Language Reduction 试验的
Origin-Trial
标头。 - [可选] 移除
Variants
标头;如果您不想发送此标头,则可以在 HTTP 响应中选择启用源试用。您也可以使用包含空值的Variants
来完成此操作。 - [可选] 移除
Content-Language
标头;如果您不想发送此标头,则可以在 HTTP 响应中加入源试用。
源试用时长
Accept-Language Reduction 源试用将运行至少六个月,相当于大约 6 个 Chrome 里程碑版本。源试用将显示在 M109 中,以 M114 结尾(表示可试用的最后一个 Chrome 版本)。届时,Chrome 会先评估源试用的反馈,然后再分阶段发送已缩减的 Accept-Language 字符串:首先缩减 Accept-Language HTTP 标头,然后缩减 JS 接口。如果网站需要更多时间进行测试,他们可以选择加入后续的弃用源试用,以便在接下来的至少六个月内访问完整的 Accept-Language 字符串。当弃用试用准备就绪后,我们会发布更多详细信息。
分享反馈
将任何问题或反馈提交到 Accept-Language Reduction GitHub 代码库。