来宾市华购网络科技有限公司
首页 | 联系方式 | 加入收藏 | 设为首页 | 手机站

产品目录

联系方式

联系人:业务部
电话: 00125-380383
邮箱:service@shnuot.com

当前位置:首页 >> 产品展示 >> 默认分类 >> 正文

根据http请求信息区分访问用户的国家、语言信息【转】

详细信息:

[百度分享]如何根据http请求信息区分访问用户国家语言信息

11-17

是不是见到google,facebook等大型专业网站的拥有不同的语言站群,可以不同语言间切换很给力?而我们只能羡慕嫉妒恨呢?rn今天要介绍的就是如何识别不同国家,只需要简单几步,就能识别出来自不同国家的请求,使你的web应用更有国际范。rn国家识别主要用到的是http header中的host,Accept-Language,cookie以及请求的url,ip等。rn下面先温习下http header的基础知识。rn[b]1 HTTP Header头格式[/b]rn在WEB开发中,无论是前端或后端都会发送请求,来浏览网页。而我们在开发中经常需要识别出客户端的信息,比如,国家,地区,浏览器信息等等。而这些信息都是由http header发送的。rn下面首先介绍下公司在扩展国际化业务中,识别客户端国家版本,使用了哪些http header。rn[b]1.1.1 HTTP Headers[/b]rnHTTP Headers是HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。rn[img=http://images.csdn.net/upimgs/1117/11.jpg][/img]rn[b]1.1.2 Host[/b]rn请求的web服务器域名地址。rn例如web请求URL:http://test. baidu.com /test/rnHost就为test.baidu.com。rn在PHP中,可以通过$_SERVER['HTTP_HOST'] 或 $_SERVER['SERVER_NAME']来查看。rn[b]1.1.3 Accept-Language[/b]rnAccept-Language: en-us,en;q=0.5rn这个信息可以说明用户的默认语言设置。如果网站有不同的语言版本,那么就可以通过这个信息来重定向用户的浏览器。rn它可以通过逗号分割来携带多国语言。第一个会是首选的语言,其它语言会携带一个“q”值,来表示用户对该语言的喜好程度(0~1)。rn在PHP中用 $_SERVER["HTTP_ACCEPT_LANGUAGE"] 来获取这一信息。rn[b]1.1.4 Cookie[/b]rn会发送你浏览器中存储的Cookie信息给服务器。rnCookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=barrn它是用分号分割的一组名值对。Cookie也可以包含session id。rn在PHP中,单一的Cookie可以访问$_COOKIE数组获得。你可以直接用$_SESSION array获取session变量。如果你需要session id,那么你可以使用session_id()函数代替cookie。rn[b]2 国家版本识别[/b]rn上面介绍了几个常用的http header,现在您已经确信可以尝试下,来识别下这些国家版本了。rn[b]2.1.1 规范[/b]rn在介绍例子前,先了解下国家识别中的已知的规范。rn语言名称用于标明当前请求对应的语言版本,遵照BCP47协议规定的tag。(在线校验:http://schneegans.de/lv/?tags=zh-CN&format=text)rn规范规定:Tag 以第一部分表示语言,都为小写,第二部分为地区,大写。中间通过中划线分隔。rn以下列出几个常见使用到的缩写规范tag:rn[img=http://images.csdn.net/upimgs/1117/22.jpg][/img]rn[img=http://images.csdn.net/upimgs/1117/33.jpg][/img]rn2.1.2 Domain (域名)方式rn这种方式是通过客户端请求的域名,如果有支持对应域名下的语言,则成功识别。rn这里的域名是发送header中的host请求,在php中通过$_SERVER['SERVER_NAME']获取。rn比如我们浏览网址:[url=http://www.xxx.com.eg]http://www.xxx.com.eg[/url]rn首页,看看浏览器发送的请求(以windows下,firefox浏览器为例),rn[img=http://images.csdn.net/upimgs/1117/44.jpg][/img]rn如上图看到的,header中host 为当前的域名,那我们可以按照以下步骤识别:rn1.后端配置好当前域名和国家版本的对应关系rn2.Server端的php程序中通过$_SERVER['SERVER_NAME'] 获取header中的host。rn3.根据第一步中的对应关系找到匹配的国家版本(region),并通过locale的对应关系找到语言。rn[b]2.1.3[/b]rnUrl & Cookie 方式rn该方式的原理如下表:rn[img=http://images.csdn.net/upimgs/1117/55.jpg][/img]rn[b]1) URL 方式[/b]rn这种方式是通过在url中传入语言的参数来确定国家版本。rn应用场景就如访问了埃及国家域名,那你查看的默认是阿拉伯语。假如想使用其他语言浏览埃及域名下的页面(如英文),这时就需要使用URL方式。rn比如我们浏览网址:http://www.xxx.com.eg?locale=en-EG。rnurl方式传入的国家语言信息优先级要高于host方式等其他方式,为最高优先级。rn[b]2) COOKIE 方式[/b]rn通过请求页面传递的cookie信息(locale)来识别版本。rn这种方式是客户端首次浏览完页面后,服务端通过host方式确认了国家语言版本后,就会在客户端设置cookie。下面的浏览请求发送的http header都会带有该cookie信息。rn下面举例介绍下cookie方式的流程:rn首次访问通过host方式识别出国家语言信息后的,http Response header如下:rn[img=http://images.csdn.net/upimgs/1117/66.jpg][/img]rn如上图所示,第一次请求后,客户端的cookie会被设置为ar-EG。rn那接下来客户端发送的请求header中都会带有该cookie。rn[img=http://images.csdn.net/upimgs/1117/77.jpg][/img]rn服务端的识别流程就如下:rn1.获取请求中的cookie,如果有国家语言信息,则进行下面rn2.判断获取的国家语言信息当前是否支持,如果支持则返回该语言下的版本,不支持在使用默认语言版本。rn[b]2.1.4 IP方式[/b]rn我们知道IP可以用来识别网络中的主机。而且IP地址段的划分是有规律的,每个国家有不同的地址段。rn那我们就可以获取客户端的ip地址,通过IP地址库,来识别国家地区,并根据国家来设置语言。rn该方式的识别流程就如下:rn1.获取请求客户端的iprn2.根据ip,确定国家,使用国家的默认语言(和其他方式一起还能识别特定语言,如accept_lanuage明确表明请求语言,可以优先展示该语言)回显给客户端rn[b]2.1.5 Accept_language方式[/b]rn“Accept_language”是为RFC2616的HTTP/1.1中14.4段定义的一个可选HTTP报头,通常被用来声明代表用户接收语言偏好。rn当客户端请求的时候,会发送默认的accept_language,服务端获取该值,如果支持,就返回该语言的版本。rn[img=http://images.csdn.net/upimgs/1117/88.jpg][/img]rn该方式的识别流程就如下:rn1.获取请求客户端的Accept_languagern2.判断获取的国家语言信息当前是否支持,如果支持则返回该语言下的版本,不支持在使用默认语言版本。rn这种方式有个缺点是:和用户使用的浏览器是版本有关。rn如:浏览器是使用中文版的firefox,那发送header请求的时候,会自动加入。rnAccept-Language zh-cn.rn下图所示为中文版firefox的请求,那么如果用户有多个语言版本的浏览器,就会在不同版本的浏览器,出现不同的语言。(如:在中文版firefox中浏览显示中文界面,而在英文版firefox中浏览显示英文界面)rn这种场景在双语国家出现的概率比较大,开发中可以根据自己的需求,灵活设置,把此种识别方式的优先级设置的低点(下面有优先级的详细介绍)。rn[img=http://images.csdn.net/upimgs/1117/99.jpg][/img]rn[b]2.1.6 优先级[/b]rn也许你可能问,我发送header请求的时候同时有host , cookie, url, accept_language, ip地址。rn那最终按那个方式来确认客户端请求的国家语言呢?rn那就需要设置各个方式的优先级,国际化识别的一般的顺序,可以如下:rn1)URL方式rn2)COOKIE 方式rn3)Domain方式rn4)Accept_language方式rn5)IP方式rn那为什么按上面的优先级呢?rnurl方式属于用户明确切换语言的情况,肯定需要最高的优先级。而cookie做为第二个可以减少识别的逻辑,使识别更加容易,复杂的识别逻辑只在客户端第一次请求时。rn当然,可以根据自己的需求安排优先级。rn[b]3 结束语[/b]rn本文中,您了解了识别国家语言的几种方式。那么在开发大型web程序中可以灵活使用这些方式,就可以识别出国家语言的信息,进而开发出支持多种语言的web应用。 论坛