Accept-Language 缩减旨在通过减少 Accept-Language
标头中的用户语言偏好设置,并仅发送用户最喜欢的语言(仅一种),从而减少被动指纹识别途径。
从 Chrome 109 Beta 版开始,我们将推出 Accept-Language 缩减功能的来源测试,让网站可以选择接收经过缩减的 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?
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 缩减功能的来源试用
源试用需要参与试用的网站在其响应中提供令牌,以指示浏览器启用指定的试用。不过,这意味着,在浏览器向网站发出初始请求时,它无法知道该网站是否参与了源测试。这意味着,会话中的初始请求不会发送经过缩减的 Accept-Language header
。针对该网页中的子资源(同源和跨源)的请求将会收到经过缩减的 Accept-Language
标头。后续的同源导航也会收到经过缩减的 Accept-Language
标头。跨源导航将恢复发送完整标头,而如果顶级框架请求具有有效的源试用令牌,则页面中的跨源请求(例如第三方 iframe 请求)仍会发送经过缩减的 Accept-Language
标头。
这与用户代理缩减来源试用类似。如果您想详细了解内部 Chromium 实现,可以参阅实现缩减 Accept-Language HTTP 标头。
参与 Accept-Language 缩减源代码试用
您可以参阅开始使用 Chrome 源试用,了解更多指南,但以下是基本步骤。
第 1 步
如需注册源代码试用版并为您的网域获取令牌,请访问“Accept-Language 减少”试用版页面。
第 2 步
更新您的 HTTP 响应标头:
- 将
Origin-Trial: <ORIGIN TRIAL TOKEN>
添加到 HTTP 响应标头中,其中 <ORIGIN TRIAL TOKEN
> 包含您在注册来源试用版时获得的令牌。 - 将
Content-Language
添加到 HTTP 响应标头,以指明面向受众群体的语言。 - 将
Variants
添加到 HTTP 响应标头,以指明网站支持的语言。 - [可选] 向 HTTP 响应添加
Vary: Accept-Language
,以创建用于内容协商的缓存键。 - 设置这些标头只会针对给定来源触发浏览器语言协商(初始请求可能会重启)。为了让网站向用户显示正确的语言表示法,您还需要根据用户的 Accept-Language 标头更新发送内容的网站(请参阅以下示例)。
第 3 步
在 Chrome M109 Beta 版(或更高版本)中加载您的网站,然后开始接收经过缩减的 Accept-Language 字符串。
如有任何问题或反馈,请提交至 Accept-Language 缩减 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
网站根据用户的 accept-language 知道用户更喜欢英语内容。响应标头可能包括:
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
)。如需查看与重定向相关的详细示例,请参阅实现文档。
第三方来源试用版支持
我们目前不支持以第三方的身份注册您的域名以试用。如果您运营的服务是作为跨来源的子资源实现的(例如广告投放或分析),则只有当顶级网站参与来源试用时,您才会收到经过缩减的 Accept-Language
标头。
验证来源试用版是否正常运行
排查 Chrome 源试用问题指南提供了完整的核对清单,可确保您的令牌配置正确无误。
您可以通过 chrome://settings/languages
或“设置”→“语言”配置多种语言及其优先级。不妨选择您的网站不支持的语言,并将其移至列表顶部,以确保触发额外的重新协商。
包含来源试用令牌的初始响应的标头应如下所示:

包含缩减后的 Accept-Language 的后续请求标头如下所示:

停止参与源代码试用
在试用期间,您可以随时停止参与,并接收用户的 Accept-Language 的完整列表。如要停止参与,请执行以下操作:
- 从 HTTP 响应中移除 Accept-Language 缩减功能试用版的
Origin-Trial
标头。 - [可选] 如果您不想在 HTTP 响应中发送用于选择加入来源测试的
Variants
标头,请将其移除。您还可以将Variants
与空值搭配使用来实现此目的。 - [可选] 如果您不想在 HTTP 响应中发送用于选择加入来源测试的
Content-Language
标头,请将其移除。
源试用期
Accept-Language 缩减源试用将至少持续 6 个月,相当于大约 6 个 Chrome 里程碑。源试用将在 M109 中显示,并在 M114(即提供该试用的最后一个 Chrome 版本)结束。届时,Chrome 会先评估来自源站试用版的反馈,然后再分阶段发送经过缩减的 Accept-Language 字符串:先缩减 Accept-Language HTTP 标头,然后缩减 JS 接口。如果某个网站需要更多时间进行测试,可以选择参与后续的废弃来源试用计划,这样他们至少还可以再使用完整的 Accept-Language 字符串六个月。废弃计划试行版准备就绪后,我们会发布有关该计划的更多详细信息。
分享反馈
如有任何问题或反馈,请提交至 Accept-Language 缩减 GitHub 代码库。