Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 用于检测国家/地区的accept_语言的准确性_Http_Geolocation_Http Accept Language - Fatal编程技术网

Http 用于检测国家/地区的accept_语言的准确性

Http 用于检测国家/地区的accept_语言的准确性,http,geolocation,http-accept-language,Http,Geolocation,Http Accept Language,我需要检测用户所在的国家/地区,但我试图避免调用外部服务来获取基于IP的位置或内部数据库。我需要使这项服务真正响应,并且查询任何外部服务都需要将近半秒钟的时间,所以我试图避免这种情况。此外,对于这种方法,任何对db的调用都会很昂贵。我需要页面在20毫秒内回复 我正在考虑根据Accept\u language标题获取国家地区 我的问题是。有人知道这有多准确吗?我知道国家/地区并不总是存在,或者用户可能会更改默认语言,或者使用计算机出现在不同的国家/地区 是否有人以前有过使用这种方法的经验,或者是否

我需要检测用户所在的国家/地区,但我试图避免调用外部服务来获取基于IP的位置或内部数据库。我需要使这项服务真正响应,并且查询任何外部服务都需要将近半秒钟的时间,所以我试图避免这种情况。此外,对于这种方法,任何对db的调用都会很昂贵。我需要页面在20毫秒内回复

我正在考虑根据
Accept\u language
标题获取国家地区

我的问题是。有人知道这有多准确吗?我知道国家/地区并不总是存在,或者用户可能会更改默认语言,或者使用计算机出现在不同的国家/地区


是否有人以前有过使用这种方法的经验,或者是否有任何文档(我在谷歌或w3页面上找不到)指定了准确率或错误率的百分比?

我只能建议您使用本地数据库。我已经使用了以下免费数据库自5年或更长的时间。只需下载zip。在加载数据库之前,您可能需要将cvs转换为mysql数据,但这很容易做到

它定期更新。而且它比任何服务器/浏览器配置都更精确

一个基于php的指南,在中使用它。这很容易

编辑:好的,我刚刚看到(上次更新于2010年12月14日)。由您决定……

  • 通过it语言设置检测用户所在国家只不过是一个坏主意。我来自德国,我认识很多人,他们使用浏览器/手机或操作系统时使用的是德语以外的其他语言。我知道有几家快递公司会检查浏览器传输的语言,如果不是德语就不起作用。猜猜我在哪里点的菜再也没有了
  • 简单的通过他们的IP检测语言。有一些(甚至是免费的)服务可以将IP转换成一个国家。
    例如:。他们确实有一个web API,一个你可以安装的服务器,或者只是获取整个数据库并自己实现它。此外,还有许多用于各种web服务器的模块/帮助程序,它们不需要任何大量的编码。(请参阅:对于Apache,这会将访问者的国家/地区嵌入为HTTP头。)
    数据库结果是缓存的,应该足够快以满足您的需要。20毫秒是非常快的,如果您考虑到所有的时间都被浪费在包到达您的服务器,然后整个返回;-)
      User@TheHippo完全正确。使用
      Accept语言
      HTTP信息获取用户的国家/地区确实不可靠。尽管如此,它并没有像速度这样的优势,因为它不依赖外部服务从IP跟踪国家。当geoIP类型的服务不可用时,或者当geoIP类型的服务为您提供了一个您的站点不提供服务或用户不提供服务的国家时,您可以尝试将其用作后端服务

      当geoIP类型服务的结果不满足时,我将此函数用作后端服务。为此,请同时检查

      //accept\u语言可以是例如“pt”或“pt”或
      //“pt pt,pt;q=0.9,en;q=0.8,en GB;q=0.7,de;q=0.6,de;q=0.5,fr;q=0.4,fr;q=0.3,es;q=0.2”
      var getCountryFromHTTP=函数(接受语言){
      var CC;//国家/地区代码
      //在某些情况下,如“fr”或“hu”,语言和国家代码是相同的
      if(接受_language.length==2){
      CC=accept_language.toUpperCase();
      }
      //从“PT PT”中去掉“PT”
      如果(接受_language.length==5){
      CC=接受_语言。子字符串(3,5);
      }
      //例如:“pt pt,pt;q=0.9,en;q=0.8,en GB;q=0.7,de;q=0.6,de;q=0.5,fr;q=0.4,fr;q=0.3,es;q=0.2”
      //获取符合2个字母的ISO国家/地区代码的前两个大写字母
      否则如果(接受_language.length>5){
      var-substr;
      
      对于(var i=0;i+2)您是对的,这是一个更好的方法。但我仍然在考虑避免调用db。这将需要更多的硬件和更多的成本,这是我试图避免的,因为这会带来大量流量(数百万/天)。语言⇏ country.Read.已经读过了。我要求将accept language方法作为区域设置的准确率为%,这并不意味着这将始终有效。使用浏览器语言是一个非常简单的实现,不需要花费成本,也不需要定期更新。IP检测也可以完全关闭,尤其是“light”Maxmind数据库故意不准确,所以当它们关闭时,如果它位于同一个大陆上,你就很幸运了。许多德国移动IP在俄罗斯注册。;-)我发现这个页面在寻找一些硬统计数据,因为我觉得浏览器语言的国家部分在表单中预选国家这样的事情上可能足够好,用户仍然可以更正错误。