Как вы определяете страну посетителя сайта (в частности, США или нет)?

Мне нужно показать разные ссылки для американских и неамериканских посетителей моего сайта. Это только для удобства, поэтому я не ищу сверхвысокую степень точности, и безопасность или спуфинг не являются проблемой.

Я знаю, что есть сервисы и списки геотаргетинга, но это кажется излишним, поскольку мне нужно только определить (грубо), если человек находится в США или нет.

Я думал об использовании JavaScript для получения часового пояса пользователя, но, похоже, это дает только смещение, поэтому пользователи в Канаде, Мексике и Южной Америке будут иметь такую ​​же ценность, как и люди в США.

Существуют ли какие-либо другие биты информации, доступные либо в JavaScript, либо в PHP, чтобы не хватать IP-адрес и выполнять поиск, чтобы определить это?

Есть несколько бесплатных сервисов, которые позволяют вам делать геолокализацию страны и ip-based с клиентской стороны.

Я использовал бесплатную услугу JSONP без wipmania , она очень проста в использовании:

<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 недостаточно для определения пользовательской локали. Он сообщает вам только то, что пользователь выбрал в качестве своего языка, что может не иметь никакого отношения к тому, где они есть. Подробнее об этом здесь .

В зависимости от того, какие страны вы хотите отличить, часовые пояса могут быть очень легким способом его достижения – и я полагаю, что он достаточно надежный, поскольку большинство людей будут иметь часы на своих компьютерах правильно. (Хотя, конечно, есть много стран, которые вы не можете отличить, используя эту технику).

Вот простой пример того, как это сделать:

http://unmissabletokyo.com/country-detector

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

@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

Мое решение, легкое и маленькое, в этом примере я тестирую регион Канады на языке fr-CA or en-CA

 if( preg_match( "/^[az]{2}\-(ca)/i", $_SERVER[ "HTTP_ACCEPT_LANGUAGE" ] ) ){ $region = "Canada"; }