Как вы определяете страну посетителя сайта (в частности, США или нет)?
Мне нужно показывать разные ссылки для американских и неамериканских посетителей на мой сайт. Это только для удобства, поэтому я не ищу сверхвысокой степени точности, а безопасность или подмена не являются проблемой.
Я знаю, что есть службы геотаргетинга и списки, но это кажется излишним, так как мне нужно только определить (примерно), находится человек в США или нет.
Я думал об использовании JavaScript для получения часового пояса пользователя, но, похоже, это только дает смещение, поэтому пользователи в Канаде, Мексике и Южной Америке будут иметь ту же ценность, что и люди в США.
Есть ли какая-либо другая информация, доступная либо в JavaScript, либо в PHP, кроме захвата IP-адреса и поиска, чтобы определить это?
8 ответов
Существуют некоторые бесплатные сервисы, которые позволяют вам осуществлять геолокализацию на основе страны и 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>
Или, если вы используете инфраструктуру, которая поддерживает 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 недостаточно для определения языкового стандарта пользователя. Он только говорит вам, что пользователь выбрал в качестве своего языка, что может не иметь никакого отношения к тому, где он находится. Подробнее об этом здесь.
Просто мы можем использовать 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
Мое решение, простое и маленькое, в этом примере я тестирую регион Канады с языка fr-CA or en-CA
if( preg_match( "/^[a-z]{2}\-(ca)/i", $_SERVER[ "HTTP_ACCEPT_LANGUAGE" ] ) ){
$region = "Canada";
}
В зависимости от того, какие страны вы хотите выделить, часовые пояса могут быть очень простым способом достижения этого - и я предполагаю, что это довольно надежно, так как большинство людей настроят часы на своих компьютерах правильно. (Хотя, конечно, есть много стран, которые вы не можете отличить, используя эту технику).
Вот действительно простой пример того, как это сделать:
@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);
}
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;
}
}
?>