Javascript 您如何检测网站访问者的国家/地区(特别是美国与否)?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2156231/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-22 22:59:12  来源:igfitidea点击:

How do you detect a website visitor's country (Specifically, US or not)?

phpjavascripttimezonecountrycountry-codes

提问by David Smith

I need to show different links for US and non-US visitors to my site. This is for convenience only, so I am not looking for a super-high degree of accuracy, and security or spoofing are not a concern.

我需要为我的网站的美国和非美国访问者显示不同的链接。这只是为了方便,所以我不是在寻找超高的准确性,安全性或欺骗性不是问题。

I know there are geotargeting services and lists, but this seems like overkill since I only need to determine (roughly) if the person is in the US or not.

我知道有地理定位服务和列表,但这似乎有点矫枉过正,因为我只需要(大致)确定此人是否在美国。

I was thinking about using JavaScript to get the user's timezone, but this appears to only give the offset, so users in Canada, Mexico, and South America would have the same value as people in the US.

我正在考虑使用 JavaScript 来获取用户的时区,但这似乎只提供了偏移量,因此加拿大、墨西哥和南美洲的用户将具有与美国用户相同的价值。

Are there any other bits of information available either in JavaScript, or PHP, short of grabbing the IP address and doing a lookup, to determine this?

除了获取 IP 地址并进行查找之外,在 JavaScript 或 PHP 中是否还有其他可用的信息来确定这一点?

回答by CMS

There are some free services out there that let you make country and ip-based geolocalization from the client-side.

有一些免费服务可以让您从客户端进行基于国家和 IP 的地理定位。

I've used the wipmaniafree JSONP service, it's really simple to use:

我用过wipmania免费的JSONP服务,使用起来真的很简单:

<script type="text/javascript">
  // plain JavaScript example
  function jsonpCallback(data) { 
    alert('Latitude: ' + data.latitude + 
          '\nLongitude: ' + data.longitude + 
          '\nCountry: ' + data.address.country); 
  }
</script>
<script src="http://api.wipmania.com/jsonp?callback=jsonpCallback"
        type="text/javascript"></script>

Or if you use a framework that supports JSONP, like jQuery you can:

或者,如果您使用支持 JSONP 的框架,例如 jQuery,您可以:

// jQuery example
$.getJSON('http://api.wipmania.com/jsonp?callback=?', function (data) { 
  alert('Latitude: ' + data.latitude + 
        '\nLongitude: ' + data.longitude + 
        '\nCountry: ' + data.address.country); 
});

Check the above snippet running here.

检查在此处运行的上述代码段。

回答by Taylor Leese

The best indicator is probably the HTTP Accept-Language header. It will look something like below in the HTTP request:

最好的指标可能是 HTTP Accept-Language 标头。它在 HTTP 请求中看起来像下面这样:

GET / HTTP/1.1
Accept: */*
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; WOW64; Trident/4.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 3.5.30729; MDDC; OfficeLiveConnector.1.4; OfficeLivePatch.0.0; .NET CLR 3.0.30729)
Accept-Encoding: gzip, deflate
Host: www.google.com
Connection: Keep-Alive

You should be able to retrieve this in PHP using the following:

您应该能够使用以下方法在 PHP 中检索它:

<?php
echo $_SERVER['HTTP_ACCEPT_LANGUAGE'];
?>

回答by Farinha

I would say that geotargetting is the only method that's even remotely reliable. But there are also cases where it doesn't help at all. I keep getting to sites that think I'm in France because my company's backbone is there and all Internet traffic goes through it.

我会说地理定位是唯一一种甚至远程可靠的方法。但也有它根本没有帮助的情况。我不断访问那些认为我在法国的网站,因为我公司的骨干网就在那里,所有互联网流量都通过它。

The HTTP Accept Header is not enough to determine the user locale. It only tells you what the user selected as their language, which may have nothing to do with where they are. More on this here.

HTTP Accept Header 不足以确定用户区域设置。它只告诉您用户选择什么作为他们的语言,这可能与他们所在的位置无关。更多关于这里

回答by Mike

Depending on which countries you want to distinguish, time zones can be a very easy way to achieve it - and I assume it's quite reliable as most people will have the clocks on their computers set right. (Though of course there are many countries you can't distinguish using this technique).

根据您要区分的国家/地区,时区可以是实现它的一种非常简单的方法 - 我认为它非常可靠,因为大多数人都会将计算机上的时钟设置正确。(当然,使用此技术您无法区分许多国家/地区)。

Here's a really simple example of how to do it:

这是一个非常简单的示例,说明如何执行此操作:

http://unmissabletokyo.com/country-detector

http://unmissabletokyo.com/country-detector

回答by Rostislav Levkovic

Wipmania.com & PHP

Wipmania.com 和 PHP

<?php
$site_name = "www.your-site-name.com";

function getUserCountry() {
    $fp = fsockopen("api.wipmania.com", 80, $errno, $errstr, 5);
    if (!$fp) {
        // API is currently down, return as "Unknown" :(
        return "XX";
    } else {
        $out = "GET /".$_SERVER['REMOTE_ADDR']."?".$site_name." HTTP/1.1\r\n";
        $out .= "Host: api.wipmania.com\r\n";
        $out .= "Typ: php\r\n";
        $out .= "Ver: 1.0\r\n";
        $out .= "Connection: Close\r\n\r\n";
        fwrite($fp, $out);
        while (!feof($fp)) {
            $country = fgets($fp, 3);
        }
        fclose($fp);
        return $country;
    }
}
?>

回答by TD_Nijboer

@rostislav

@罗斯蒂斯拉夫

or using cURL:

或使用卷曲:

public function __construct($site_name) {
    // create a new cURL resource
    $ch = curl_init();

    // set URL and other appropriate options
    curl_setopt($ch, CURLOPT_POST, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml"));
    curl_setopt($ch, CURLOPT_URL, "http://api.wipmania.com".$_SERVER['REMOTE_ADDR']."?".$site_name);
    curl_setopt($ch, CURLOPT_HEADER, 0);

    // grab URL and pass it to the browser
    $response = curl_exec($ch);
    $info = curl_getinfo($ch,CURLINFO_HTTP_CODE);

    if (($response === false) || ($info !== 200)) {
        throw new Exception('HTTP Error calling Wipmania API - HTTP Status: ' . $info . ' - cURL Erorr: ' . curl_error($ch));
    } elseif (curl_errno($ch) > 0) {
        throw new Exception('HTTP Error calling Wipmania API - cURL Error: ' . curl_error($ch));
    }

    $this->country = $response;

    // close cURL resource, and free up system resources
    curl_close($ch);
}

回答by Leonardo Ciaccio

My solution, easy and small, in this example i test Canada region from language fr-CA or en-CA

我的解决方案,简单而小巧,在这个例子中,我从语言测试加拿大地区 fr-CA or en-CA

if( preg_match( "/^[a-z]{2}\-(ca)/i", $_SERVER[ "HTTP_ACCEPT_LANGUAGE" ] ) ){

   $region = "Canada";

}

回答by sameeuor

Simply we can use Hostip API

我们可以简单地使用 Hostip API

<?php $country_code = file_get_contents("http://api.hostip.info/country.php"); <br/>if($country_code == "US"){ echo "You Are USA"; } <br/>else{ echo "You Are Not USA";} ?>

All Country codes are here.. http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2

所有国家/地区代码都在这里.. http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2