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

     2023-04-18     28

关键词:

【中文标题】您如何检测网站访问者的国家/地区(特别是美国与否)?【英文标题】:How do you detect a website visitor's country (Specifically, US or not)? 【发布时间】:2011-01-10 12:06:26 【问题描述】:

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

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

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

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

【问题讨论】:

我认为基于 IP 的解决方案是唯一可靠的方法。其他任何事情都可能受到用户设置的影响。基于 IP 的解决方案也可能存在偏差,但难度更大。 @FrustratedWithFormsDesigner - 注意他说,“这只是为了方便,所以我不是在寻找超高的准确性,安全或欺骗不是问题。”因此,基于 IP 的解决方案可能对他的需求来说太过分了。他还说,“......没有获取 IP 地址并进行查找来确定这一点吗?” 【参考方案1】:

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

我用过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>

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

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

检查上面运行here的sn-p。

【讨论】:

如何修改您的代码,以便使用 URL 重定向而不是警告对话框,将美国访问者带到 .COM 地址并允许加拿大访问者正常通过? (对于具有姐妹 .COM 版本网站的 .CA 版本网站) onload事件中的switch语句,查看json函数返回的“country”,然后调用Server.Transfer或类似方法。 非常感谢代码和链接,它的工作和真棒:) 这不支持 https :( 我一般用geo-ip.net/locate?query=***.com&format=json它支持ssl连接【参考方案2】:

最好的指标可能是 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'];
?>

【讨论】:

什么决定了接受语言?它是由操作系统设置的,还是用户可以影响它?如果我的同事将他的笔记本电脑设置为使用中文,Accept-Language 会是什么?另外,en-gb 呢? 由用户的浏览器设置决定。 @FrustratedWithFormsDesigner:接受语言由浏览器决定。如果他们愿意,它可以由用户操作。例如,在 firefox 下,转到 Preferences > Content > Languages 由浏览器设置,通常从操作系统初始化。因此,当我在加拿大时,通过设置通常在 IE 和 FF 等浏览器中调用的“语言”,我可以看起来在美国、英国或其他地方。 伙计们,尤其是泰勒,这看起来可能是我需要的解决方案。正如我所说,我不在乎用户是否假装来自其他地方,因为他们当然欢迎这样做。我会花一些时间看看我是否还有其他好的选择,但谢谢!【参考方案3】:

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

HTTP 接受标头不足以确定用户区域设置。它只告诉您用户选择的语言,这可能与他们所在的位置无关。更多关于这个here。

【讨论】:

【参考方案4】:

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;
    

?>

【讨论】:

【参考方案5】:

@rostislav

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

【讨论】:

【参考方案6】:

我们可以简单地使用 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"; ?>

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

【讨论】:

是服务器端吗?所以它正在检查服务器位置而不是 cilent?【参考方案7】:

我的解决方案,简单而小巧,在此示例中,我使用语言 fr-CA or en-CA 测试加拿大地区

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

   $region = "Canada";


【讨论】:

【参考方案8】:

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

这是一个非常简单的例子:

http://unmissabletokyo.com/country-detector

【讨论】:

这在很多国家有共享时区的情况下不起作用。

限制访问特定国家/地区的 PHP 网站

...】:既然IP可以被欺骗,那么如何构建一个能够正确识别访问者所在国家/地区的PHP网站?【问题讨论】:【参考方案1】:鉴于互联网的匿名性,这本质上是一个问题,但无论如何,通过欺骗IP地址来获取您所在国家/地区不合法... 查看详情

识别我网站的访问者所在的国家/地区

】识别我网站的访问者所在的国家/地区【英文标题】:Identifyingthecountryofvisitortomywebsite【发布时间】:2009-07-2421:53:33【问题描述】:我想使用php识别我的访问者来自哪个国家/地区。我该怎么做?【问题讨论】:【参考方案1】:... 查看详情

如何在 PHP 中按国家/地区记录 IP?

...0210:57:17【问题描述】:如何确定IP来自哪个国家?比如当访问者来到一个站点时,我可以使用记录IP$_SERVER[\'REMOTE_ADDR\'],但这都是数字的组合,如果假设我只想记录来自美国、澳大利亚、英国或我特别想要的任何其他国家的IP地址... 查看详情

如何阻止某个国家/地区访问我的网站

...:52:20【问题描述】:我有一个法国网站,我有很多俄罗斯访问者(机器人?),我不希望他们出现在我的GA统计数据中。所以首先我试图阻止俄罗斯访问者通过htaccess访问我的网站。但仍然是俄罗斯游客......然后我尝试只允许法... 查看详情

如何检测访客国家

...try【发布时间】:2013-07-1108:10:10【问题描述】:为了检测访问者国家/地区,我在许多论坛中看到了以下代码,但我无法让它工作。modGlobal.ResolveCountry.ThreeLetterISORegionName在我的本地机器上它正确地返回我的计算机区域设置区域,... 查看详情

如何检测 IP 属于美国的特定州

】如何检测IP属于美国的特定州【英文标题】:HowtodetectanipbelongstoaparticularstateofUSA【发布时间】:2015-09-1511:27:14【问题描述】:我正在开发一个聊天应用程序,其中模型可以禁止美国的某个州,以便该州的用户无法与该模型聊天... 查看详情

如何检测客户端站点中的浏览器国家/地区?

】如何检测客户端站点中的浏览器国家/地区?【英文标题】:Howtodetectbrowsercountryinclientsite?【发布时间】:2018-06-2423:18:50【问题描述】:我发现以下网站即使在私密模式下也能检测到我的国家和货币http://www.innisfreeworld.com/它记录... 查看详情

根据访问者 IP 地址(国家/地区)将主网站重定向到子域

】根据访问者IP地址(国家/地区)将主网站重定向到子域【英文标题】:RedirectmainwebsitetosubdomainbasedonvisitorIPaddress(country)【发布时间】:2018-01-2809:37:32【问题描述】:我需要根据访问者IP地址(位置)将我的网站重定向到子域的... 查看详情

多语言/国家网络项目

...针对多个国家和语言的网站以获得一些灵感,看看他们是如何做到的。因此,在这篇文章中,我希望您能给我举一些针对多个国家/地区的网站示例。/迈 查看详情

如何使用客户端代码阻止一个国家​​/地区访问网站

】如何使用客户端代码阻止一个国家​​/地区访问网站【英文标题】:Howtoblockacountryfromvisitingawebsiteusingclientsidecode【发布时间】:2013-01-1419:05:48【问题描述】:我已经用谷歌搜索了很长时间以达到我的目标,但徒劳无功。我有... 查看详情

如何区分国家

】如何区分国家【英文标题】:HowTodifferentiatecountry【发布时间】:2019-03-2107:33:32【问题描述】:我想开发像亚马逊这样的安卓应用。我的问题是如何根据国家/地区展示我的产品。例如,如果我在印度,我的应用程序仅显示印度... 查看详情

场地的国家代码是如何生成的?

】场地的国家代码是如何生成的?【英文标题】:Howthecountrycodeofavenueisgenerated?【发布时间】:2013-01-0710:19:50【问题描述】:我正在使用FSAPI开发一个APP,我需要对场地进行地理定位。没有什么特别困难的,只是“美国”或“非美... 查看详情

在javaservlet中自动为用户选择国家/地区和语言

...求详细信息(IP地址,浏览器信息等)在JavaServlet中自动检测用户所在国家/地区和语言。是否可以为大多数用户检测这些设置(~90%)?答案检测语言检测正确的语言很容易。Web浏览器倾向于发送AcceptLanguage标头,JavaServletAPI非常... 查看详情

如何根据国家/地区的IP地址重定向网站

】如何根据国家/地区的IP地址重定向网站【英文标题】:Howtoredirectawebsiteaccordingtocountry\'sIPaddress【发布时间】:2017-01-0615:45:27【问题描述】:我正在开发一个消息应用程序,其服务器端代码是用Erlang开发的。我面临的问题是关于... 查看详情

获取网站访问者的电子邮件提醒

】获取网站访问者的电子邮件提醒【英文标题】:GetemailalertsofwebsitevisitorsLocation【发布时间】:2011-06-2110:30:06【问题描述】:我想收到有关访问我网站的网站访问者位置(城市、地区、国家/地区、邮政编码)的电子邮件提醒。... 查看详情

当用户在 Google 地图中拒绝位置访问时,如何向用户显示当前国家/地区?

】当用户在Google地图中拒绝位置访问时,如何向用户显示当前国家/地区?【英文标题】:Howcanishowuser\'scurrentcountrywhenuserdenieslocationaccessinGooglemap?【发布时间】:2018-07-1218:37:13【问题描述】:当用户拒绝用户的位置访问时,有什... 查看详情

如何/在哪里获取非美国国家/地区的州、省和行政区的 geoJSON 数据? [关闭]

】如何/在哪里获取非美国国家/地区的州、省和行政区的geoJSON数据?[关闭]【英文标题】:How/WheredoIgetgeoJSONdataforstates,provinces,andadministrativeregionsofnon-UScountries?[closed]【发布时间】:2013-06-2011:22:53【问题描述】:我需要多个国家/地... 查看详情

如果您只有国家/地区名称,如何将谷歌地图围绕一个国家/地区居中

】如果您只有国家/地区名称,如何将谷歌地图围绕一个国家/地区居中【英文标题】:Howtocenteragooglemaparoundacountryifyoujusthavethecountryname【发布时间】:2011-08-3011:44:30【问题描述】:我有一个关于在各个国家/地区徒步旅行的页面。... 查看详情