飘在云端

啊!那蓝真天,白真云!

· 前端 · · 853次浏览

IE 11 header Accept-Language 值与逻辑

我系统的IE11访问某些提供多国语言的网站,有一半的网站会识别访问者的客户端为法语,另一半正常识别为简体中文,Fiddler2抓包,发现IE的header返回的Accept-Language为 fr (法语)。
能识别我的环境为简体中文的网站是使用navigator.browserLanguage /navigator.language 之类的js方法;识别错误的的并没有使用这个方法判断, 他们判断浏览器Header的Accept Language值,正常来说,这2个值趋于一致的,不过我的IE11有点问题,返回非简体中文的语言环境。
查微软的IE文档和一番调试,发现挺有意思,发现IE返回语言字符串的逻辑是这样的:
对于win10 1803之前版本,跟访问者的操作系统语言环境和控制面板的区域和语言里面的web内容语言设置有关,web内容语言这个开关,能决定IE是否能返回win语言环境的类型,如果√上这个开关,IE将只能返回浏览器语言,这个浏览器语言不是指IE浏览器界面使用的语言,跟你浏览器界面设置的语言没关系,而是保存在注册表的一个值,这个值没办法在浏览器直接设置,也不知道由什么决定的(我尝试更改操作系统语言环境和重装IE也没改变)。
但是,我们能手动设定一个值来代替那个header:Accept-Language,来修复这个问题,注册表路径是

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International, AcceptLanguage, xxxxx

默认情况下,上面的字符串键值名AcceptLanguage是不存在的,字符串的内容xxxxxx为语言代码,如zh-Hans-CN。
我的情况比较诡异,在初始默认未设置任何语言代码的情况下,IE的header居然发送 fr,即法语的语言代码。
对于win 10 1803 以后的版本,原来的 web内容语言 设置选项被移除了,转移到了 设置-隐私-常规-允许网站通过访问我的语言列表来提供本地相关内容,如果这个开关打开了,则会返回操作系统的语言环境,使用accept language的方式判断客户端语言环境也不会出问题,反复切换这个开关,发现windows会删除注册表IE设置的accept language值,转而返回系统的语言环境变量。
具体修改流程:

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\International

在这个路径下,添加一个名为 AcceptLanguage 的字符串,值为 zh-Hans-CN,zh-Hans;
关闭IE重新打开,实时生效,发现IE11会正常返回设定的值了,在任意提供多国语言环境的web网站,会正常识别为简体中文了。

唯一一点疑惑,就是不知道为什么我的环境默认情况下是返回fr(法语),默认情况下,IE11不会发送任何识别语言的header。百思不得其解,我从未设置过法语相关的系统语言环境和区域,我尝试搜索IE设置的相关注册表项,也没找到fr相关的语言环境设置键值。

对于其他浏览器,无论是通过navigator方法还是识别header的Accept Language,在谷歌浏览器下全部都正常识别为zh-cn(谷歌浏览器 v80.x x64)。
我通过上面注册表手动设置了header头后,IE访问任意网站都会在header包含你设定的值,所有网站识别正常,然后我再删除header头,结果在IE没发送header头的情形下,所有网站还是能识别正常(已确认IE没发送header,Accept-Language)。
那之前的默认识别fr又是什么情况?

评论 (0条)