我需要为我的网站的美国和非美国访问者显示不同的链接。这只是为了方便,所以我不是在寻找超高的准确性,安全或欺骗不是问题。
我知道有地理定位服务和列表,但这似乎有点矫枉过正,因为我只需要(大致)确定此人是否在美国。
我正在考虑使用 JavaScript 来获取用户的时区,但这似乎只给出了偏移量,因此加拿大、墨西哥和南美的用户与美国的用户具有相同的价值。
JavaScript 或 PHP 中是否还有其他可用信息,除了获取 IP 地址并进行查找来确定这一点吗?
我需要为我的网站的美国和非美国访问者显示不同的链接。这只是为了方便,所以我不是在寻找超高的准确性,安全或欺骗不是问题。
我知道有地理定位服务和列表,但这似乎有点矫枉过正,因为我只需要(大致)确定此人是否在美国。
我正在考虑使用 JavaScript 来获取用户的时区,但这似乎只给出了偏移量,因此加拿大、墨西哥和南美的用户与美国的用户具有相同的价值。
JavaScript 或 PHP 中是否还有其他可用信息,除了获取 IP 地址并进行查找来确定这一点吗?
有一些免费服务可让您从客户端进行基于国家和 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);
});
检查在此处运行的上述代码段。
最好的指标可能是 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'];
?>
我会说地理定位是唯一甚至远程可靠的方法。但也有一些根本没有帮助的情况。我不断访问那些认为我在法国的网站,因为我公司的骨干网在那里,所有的互联网流量都通过它。
HTTP Accept Header 不足以确定用户区域设置。它只告诉您用户选择的语言,这可能与他们所在的位置无关。更多关于这个here。
@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);
}
我们可以简单地使用 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
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;
}
}
?>
我的解决方案,简单而小巧,在这个例子中,我从语言测试加拿大地区fr-CA or en-CA
if( preg_match( "/^[a-z]{2}\-(ca)/i", $_SERVER[ "HTTP_ACCEPT_LANGUAGE" ] ) ){
$region = "Canada";
}
根据您要区分的国家/地区,时区可能是实现它的一种非常简单的方法 - 我认为它非常可靠,因为大多数人都会正确设置计算机上的时钟。(当然,使用这种技术您无法区分许多国家)。
这是一个非常简单的示例: