是否有快速获取用户国家/地区代码的方法?

时间:2011-01-23 14:47:46

标签: php geolocation

我想知道用户是从英国浏览还是使用英国浏览器。如果没有,我可以放心地认为他们是美国访客。

我可以在数据库中查找他们的IP,但这有点慢,我宁愿从他们的User-agent或其他一些HTTP头中找到。

如果并不总是正确无关紧要,并且存在歧义(例如在英国使用美国电脑的人)。

2 个答案:

答案 0 :(得分:2)

您可以检查Accept-Language标头字段。

  

14.4接受语言

     

Accept-Language请求标头   字段类似于Accept,但是   限制自然语言集   作为回应的首选   请求。语言标签已定义   在第3.10节中。

   Accept-Language = "Accept-Language" ":"
                     1#( language-range [ ";" "q" "=" qvalue ]
     

)          language-range =((1 * 8ALPHA *(“ - ”1 * 8ALPHA))|“*”)

     

每个语言范围可以给出一个   相关的质量价值   代表用户的估计   对指定语言的偏好   在那个范围内。质量价值   默认为“q = 1”。例如,

   Accept-Language: da, en-gb;q=0.8, en;q=0.7
     

意思是:“我更喜欢丹麦语,但愿意   接受英国英语和其他类型   英语。“语言范围匹配   一个语言标签,如果它完全相等   标签,或者它是否完全等于a   标签的前缀使得第一个   前缀后面的标记字符是   “ - ”。特殊范围“*”,如果存在的话   在Accept-Language字段中,匹配   每个标签都不匹配任何其他标签   接受语言中存在的范围   字段。

  Note: This use of a prefix matching rule does not imply that
  language tags are assigned to languages in such a way that it is
  always true that if a user understands a language with a certain
  tag, then this user will also understand all languages with tags
  for which this tag is a prefix. The prefix rule simply allows the
  use of prefix tags if this is the case.
     

指定的语言质量因素   到了语言标签   Accept-Language字段是质量   最长语言范围的值   在匹配的字段中   语言标签。如果没有语言范围   该字段匹配标记,   分配的语言质量因子为0。   如果没有Accept-Language标头   出现在请求中的服务器

     

应该假设所有语言都是   同样可以接受如果   接受语言标题存在,   然后是所有分配的语言   品质因数大于0   可以接受的。

     

这可能与隐私相悖   用户期望发送   Accept-Language标题包含   完整的语言偏好   用户在每个请求中。为一个   有关此问题的讨论,请参阅部分   15.1.4。

     

因为可懂度高度依赖   在个人用户上,它是   建议客户端应用程序   做出语言选择   用户可用的首选项。如果   那么选择是不可用的   Accept-Language头字段必须   不在请求中给出。

  Note: When making the choice of linguistic preference available to
  the user, we remind implementors of  the fact that users are not
  familiar with the details of language matching as described above,
  and should provide appropriate guidance. As an example, users
  might assume that on selecting "en-gb", they will be served any
  kind of English document if British English is not available. A
  user agent might suggest in such a case to add "en" to get the
  best matching behavior.

答案 1 :(得分:1)

  

我可以在数据库中查找他们的IP,但这有点慢

不,不是。


您可以使用Accept-Language HTTP header来检测首选语言。