有些网站需要根据用户的位置,自动选择不同的语言,或者根据不同的国家,设置不同的时间显示方式,又或者跳转到不同的服务器路由。对于这个问题,我们该如何实现呢?这里我们讲一些非付费的方式,土豪请自我忽略。
方法一:根据客户端的语言来判断
这种方法是利用用户使用的浏览器的语言偏好来判断,这个方法简单快速,但是这个显然是不准确的。
var language = navigator.language; //navigator 中的language表示客户端用户偏好的第一语言,而languages是浏览器的语言列表,如果是zh-CN,则表示是中文,而en-US则表示美国。
方法二:利用header 里的Accept-Language来判断
一般网页发送到服务器时,会携带一个Accept-Language的头部信息,它可以通过逗号分割来携带多国语言。第一个会是首选的语言,其它语言会携带一个“q”值,来表示用户对该语言的喜好程度(0~1)。 这个方法和上面的同样是不准确的。
string languages = HttpContext.Request.Headers["Accept-Language"]; C#获取
方法三:利用IP地址来判断
根据客户端的IP地址来确定是相对来说比较准确的方法。原理就是通过IP地址所在的区域确定国家信息,互联网构建时的IP地址区域分配是有一定的数据规划的,不同的区域给的IP地址会是一段一段的,通过这个段位数据的字典查询就能知道客户所在的区域了。这个也是有可能不准确,比如当通过VPN来访问时,或者代理访问时都有可能不准确,但相对来说,这种情况少见,也是可以接受的。
直接通过第三方服务来获取信息
比较强大的第三库,不得不推荐MaxMind的GeoIP®Databases and Services,他们有自己的IP库,提供各种准确的接口,付费的可以根据定位很准确,不付费的只可以模糊定位到国家,不过已经符合我们的需求。
javascript端的实现过程可以查看文档:
https://dev.maxmind.com/geoip/geolocate-an-ip/client-side-javascript
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div>
目前所在:<span id="result"></span>
</div>
<script src="//geoip-js.com/js/apis/geoip2/v2.1/geoip2.js" type="text/javascript"></script>
<script>
var test = (function () {
var onSuccess = function (geoipResponse) {
/* There's no guarantee that a successful response object
* has any particular property, so we need to code defensively. */
if (!geoipResponse.country.iso_code) {