Php 如何检测网站访问者';s国家(特别是美国还是非美国)?

Php 如何检测网站访问者';s国家(特别是美国还是非美国)?,php,javascript,timezone,country,country-codes,Php,Javascript,Timezone,Country,Country Codes,我需要为我的网站的美国和非美国访问者显示不同的链接。这只是为了方便起见,所以我不寻求超高的准确度,也不担心安全性或欺骗 我知道有地理定位服务和列表,但这似乎有些过分,因为我只需要(粗略地)确定此人是否在美国 我曾考虑使用JavaScript获取用户的时区,但这似乎只给出了偏移量,因此加拿大、墨西哥和南美洲的用户与美国的用户具有相同的价值 除了抓取IP地址并进行查找之外,JavaScript或PHP中还有其他可用信息吗?最好的指示符可能是HTTP Accept Language标头。在HTTP请求

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

我知道有地理定位服务和列表,但这似乎有些过分,因为我只需要(粗略地)确定此人是否在美国

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


除了抓取IP地址并进行查找之外,JavaScript或PHP中还有其他可用信息吗?

最好的指示符可能是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
您应该能够使用以下方法在PHP中检索此内容:

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

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

我使用了免费的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>

检查上面运行的代码片段。

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


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

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

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

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;
    }
}
?>
罗斯蒂斯拉夫

或者使用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);
}

我们可以简单地使用hostipapi

<?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";} ?>

所有的国家代码都在这里。。

我的解决方案,简单小巧,在本例中,我从语言
fr-CA或en-CA

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

   $region = "Canada";

}

什么决定我们接受语言?它是由操作系统设置的,还是用户可以影响它?如果我的同事将他的笔记本电脑设置为使用中文,那么接受的语言是什么?另外,en gb呢?它由用户的浏览器设置决定。@FrustratedWithFormsDesigner:接受语言由浏览器决定。如果用户选择,它可以由用户操纵。例如,在firefox下,转到Preferences>Content>LanguagesIt由浏览器设置,通常从操作系统初始化。因此,当我在加拿大时,我可以通过设置IE和FF等浏览器中通常称为的“语言”来显示我在美国、英国或其他地方。伙计们,尤其是泰勒,这看起来可能是我需要的解决方案。正如我所说,我不在乎用户是否假装来自其他地方,因为他们当然欢迎这样做。我会给它一些时间看看我是否还有其他好的选择,但是谢谢你!我认为基于IP的解决方案是唯一可靠的方法。其他任何内容都可能受用户设置的影响。基于IP的解决方案也可能有偏差,但更难。@FrustedWithFormsDesigner-注意,他说,“这只是为了方便,所以我不寻求超高的准确性,安全性或欺骗不受关注。”因此,基于IP的解决方案对于他所需的可能有些过火。他还说,“……除了抓取IP地址并进行查找之外,如何确定这一点?”如何修改您的代码,以使URL重定向代替警报对话框,将美国访客带到.COM地址,并允许加拿大访客正常通过?(对于带有姐妹.COM版本站点的网站的.CA版本)onload事件中的switch语句,请检查json函数返回的“country”,然后调用Server.Transfer或similiar。非常感谢您提供的代码和链接,它可以正常工作,非常棒:)这不支持https:(我通常使用它支持ssl连接它是服务器端?所以它检查的是服务器位置而不是cilent?
if( preg_match( "/^[a-z]{2}\-(ca)/i", $_SERVER[ "HTTP_ACCEPT_LANGUAGE" ] ) ){

   $region = "Canada";

}