关键词:
【中文标题】您如何检测网站访问者的国家/地区(特别是美国与否)?【英文标题】: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【问题描述】:我有一个关于在各个国家/地区徒步旅行的页面。... 查看详情