7

如何根据http请求信息区分访问用户的国家、语言信息

 2 years ago
source link: https://blogread.cn/it/article/4604?f=hot1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

如何根据http请求信息区分访问用户的国家、语言信息

浏览:2892次  出处信息

是不是见到google,facebook等大型专业网站的拥有不同的语言站群,可以不同语言间切换很给力?而我们只能羡慕嫉妒恨呢?
今天要介绍的就是如何识别不同国家,只需要简单几步,就能识别出来自不同国家的请求,使你的web应用更有国际范。
国家识别主要用到的是http header中的host,Accept-Language,cookie以及请求的url,ip等。
下面先温习下http header的基础知识。

1 HTTP Header头格式

在WEB开发中,无论是前端或后端都会发送请求,来浏览网页。而我们在开发中经常需要识别出客户端的信息,比如,国家,地区,浏览器信息等等。而这些信息都是由http header发送的。
下面首先介绍下公司在扩展国际化业务中,识别客户端国家版本,使用了哪些http header。

1.1.1 HTTP Headers

HTTP Headers是HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。

1.1.2 Host

请求的web服务器域名地址。
例如web请求URL:http://test. baidu.com /test/
Host就为test.baidu.com。
在PHP中,可以通过$_SERVER['HTTP_HOST'] 或 $_SERVER['SERVER_NAME']来查看。

1.1.3 Accept-Language

Accept-Language: en-us,en;q=0.5
这个信息可以说明用户的默认语言设置。如果网站有不同的语言版本,那么就可以通过这个信息来重定向用户的浏览器。
它可以通过逗号分割来携带多国语言。第一个会是首选的语言,其它语言会携带一个“q”值,来表示用户对该语言的喜好程度(0~1)。
在PHP中用 $_SERVER["HTTP_ACCEPT_LANGUAGE"] 来获取这一信息。

1.1.4 Cookie

会发送你浏览器中存储的Cookie信息给服务器。
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar
它是用分号分割的一组名值对。Cookie也可以包含session id。
在PHP中,单一的Cookie可以访问$_COOKIE数组获得。你可以直接用$_SESSION array获取session变量。如果你需要session id,那么你可以使用session_id()函数代替cookie。

2 国家版本识别

上面介绍了几个常用的http header,现在您已经确信可以尝试下,来识别下这些国家版本了。

2.1.1 规范

在介绍例子前,先了解下国家识别中的已知的规范。

语言名称用于标明当前请求对应的语言版本,遵照BCP47协议规定的tag。(在线校验:http://schneegans.de/lv/?tags=zh-CN&format=text

规范规定:Tag 以第一部分表示语言,都为小写,第二部分为地区,大写。中间通过中划线分隔。
以下列出几个常见使用到的缩写规范tag:

2.1.2 Domain (域名)方式

这种方式是通过客户端请求的域名,如果有支持对应域名下的语言,则成功识别。

这里的域名是发送header中的host请求,在php中通过$_SERVER['SERVER_NAME']获取。

比如我们浏览网址:http://www.xxx.com.eg

首页,看看浏览器发送的请求(以windows下,firefox浏览器为例),

如上图看到的,header中host 为当前的域名,那我们可以按照以下步骤识别:
1. 后端配置好当前域名和国家版本的对应关系
2. Server端的php程序中通过$_SERVER['SERVER_NAME'] 获取header中的host。
3. 根据第一步中的对应关系找到匹配的国家版本(region),并通过locale的对应关系找到语言。

2.1.3

Url & Cookie 方式
该方式的原理如下表:

1) URL 方式

这种方式是通过在url中传入语言的参数来确定国家版本。
应用场景就如访问了埃及国家域名,那你查看的默认是阿拉伯语。假如想使用其他语言浏览埃及域名下的页面(如英文),这时就需要使用URL方式。

比如我们浏览网址:http://www.xxx.com.eg?locale=en-EG

url方式传入的国家语言信息优先级要高于host方式等其他方式,为最高优先级。

2)  COOKIE 方式

通过请求页面传递的cookie信息(locale)来识别版本。

这种方式是客户端首次浏览完页面后,服务端通过host方式确认了国家语言版本后,就会在客户端设置cookie。下面的浏览请求发送的http header都会带有该cookie信息。

下面举例介绍下cookie方式的流程:

首次访问通过host方式识别出国家语言信息后的,http Response header如下:

如上图所示,第一次请求后,客户端的cookie会被设置为ar-EG。
那接下来客户端发送的请求header中都会带有该cookie。

服务端的识别流程就如下:
1. 获取请求中的cookie,如果有国家语言信息,则进行下面
2. 判断获取的国家语言信息当前是否支持,如果支持则返回该语言下的版本,不支持在使用默认语言版本。

2.1.4 IP方式

我们知道IP可以用来识别网络中的主机。而且IP地址段的划分是有规律的,每个国家有不同的地址段。
那我们就可以获取客户端的ip地址,通过IP地址库,来识别国家地区,并根据国家来设置语言。
该方式的识别流程就如下:
1. 获取请求客户端的ip
2. 根据ip,确定国家,使用国家的默认语言(和其他方式一起还能识别特定语言,如accept_lanuage明确表明请求语言,可以优先展示该语言)回显给客户端

2.1.5 Accept_language方式

“Accept_language”是为RFC2616的HTTP/1.1中14.4段定义的一个可选HTTP报头,通常被用来声明代表用户接收语言偏好。
当客户端请求的时候,会发送默认的accept_language,服务端获取该值,如果支持,就返回该语言的版本。

该方式的识别流程就如下:
1. 获取请求客户端的Accept_language
2. 判断获取的国家语言信息当前是否支持,如果支持则返回该语言下的版本,不支持在使用默认语言版本。
这种方式有个缺点是:和用户使用的浏览器是版本有关。
如:浏览器是使用中文版的firefox,那发送header请求的时候,会自动加入。
Accept-Language zh-cn.
下图所示为中文版firefox的请求,那么如果用户有多个语言版本的浏览器,就会在不同版本的浏览器,出现不同的语言。(如:在中文版firefox中浏览显示中文界面,而在英文版firefox中浏览显示英文界面)
这种场景在双语国家出现的概率比较大,开发中可以根据自己的需求,灵活设置,把此种识别方式的优先级设置的低点(下面有优先级的详细介绍)。

2.1.6 优先级

也许你可能问,我发送header请求的时候同时有host , cookie, url, accept_language, ip地址。
那最终按那个方式来确认客户端请求的国家语言呢?
那就需要设置各个方式的优先级,国际化识别的一般的顺序,可以如下:
1) URL方式
2) COOKIE 方式
3) Domain方式
4) Accept_language方式
5) IP方式
那为什么按上面的优先级呢?
url方式属于用户明确切换语言的情况,肯定需要最高的优先级。而cookie做为第二个可以减少识别的逻辑,使识别更加容易,复杂的识别逻辑只在客户端第一次请求时。
当然,可以根据自己的需求安排优先级。

本文中,您了解了识别国家语言的几种方式。那么在开发大型web程序中可以灵活使用这些方式,就可以识别出国家语言的信息,进而开发出支持多种语言的web应用。

建议继续学习:

QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK