Я хотел бы иметь возможность определить, в какой стране посетитель находится на моем веб-сайте, используя PHP.
Обратите внимание, что я не пытаюсь использовать это в качестве меры безопасности или для чего-либо важного, просто изменяя написание некоторых слов (американцы, похоже, считают, что слово «зачисление» имеет 2 Ls … сумасшедшие янки) и возможно, предоставить вариант по умолчанию в списке «Выберите свою страну».
Таким образом, использование базы данных Geolocation – это чуть более-топ, и я действительно не хочу гадать с установкой новых библиотек PHP только для этого, так что самый простой / самый простой способ найти, в какой стране посетитель?
Не гарантируется, но большинство браузеров представляют HTTP-заголовок Accept-Language, который указывает en-us, если они из США. Некоторые старые браузеры только сказали, что они en. И не все машины настроены правильно, чтобы указать, какой язык они предпочитают. Но это хорошая первая догадка.
Английские-британские пользователи обычно устанавливают свою систему или пользовательскую локали на английский-британский, что в конфигурациях браузера по умолчанию должно приводить к появлению en-gb в качестве заголовка Accept Language. (Ранняя версия этого сказанного en-uk, это была опечатка, извините). В других странах также есть en locales, такие как en-za (южная африка) и, в основном теоретически, такие комбинации, как en-jp, также возможны.
Однако предположения, основанные на Geo-IP, будут менее корректными на предпочтительном языке / локали. Google считает, что согласование контента на основе геолокации IP-адреса имеет смысл, что меня действительно раздражает, когда я в Японии или Корее …
PHP предоставляет функцию с 5.3.0 для анализа переменной $ _SERVER ['HTTP_ACCEPT_LANGUAGE'] в локали.
http://www.php.net/manual/en/locale.acceptfromhttp.php
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']); echo $locale; // returns "en_US"
Вы можете проверить заголовок HTTP_ACCEPT_LANGUAGE
(от $ _SERVER), который отправит большинство браузеров.
Взгляните на Zend_Locale для примера, или, может быть, вы даже захотите использовать lib.
Вы можете сделать несколько IP-компарадионов, не имея целую библиотеку для этого.
Используйте API, так что с вашей стороны ничего не нужно. Это веб-API, который позволяет вам узнать страну:
Example: http://api.hostip.info/get_html.php?ip=12.215.42.19 Return : Country: UNITED STATES (US)
Но, думали ли вы использовать язык агента браузера? Возможно, вы сможете узнать тип английского языка.
Этот веб-сайт под названием BlockCountry позволяет вам иметь список IP-адресов по странам. Конечно, вы не хотите блокировать, но вы можете использовать список IP-адресов и сравнить их (получить все IP-адреса США …), это может быть неточно …
С учетом вашей заявленной цели заголовок Accept-Language является более подходящим решением, чем геолокация на основе IP. В самом деле, это точно намеченная цель Accept-Language.
Parse $ _SERVER ["HTTP_ACCEPT_LANGUAGE"], чтобы получить страну и язык браузера
Или вы можете сделать следующее:
скачать 'geoip.dat' и geoip.inc с http://www.maxmind.com/app/geoip_country
в заголовке geoip.inc вы найдете, как его использовать (например, инициализировать и остальное …)
Расширение GeoIP – хороший выбор.
Для определения вашей страны посетителя я использовал расширение GeoIP , очень прост в использовании.
Служба http://countries.nerd.dk – это то, что я использую для сопоставления IP-to-country. Он работает очень хорошо и основывается на DNS, также кэшируется.
Вы также можете загрузить базу данных для локального использования, если не хотите полагаться на внешнюю службу.
Одна вещь, которую хочет видеть зритель, вторая – которую вы можете обслуживать:
$SystemLocales = explode("\n", shell_exec('locale -a')); $BrowserLocales = explode(",",str_replace("-","_",$_SERVER["HTTP_ACCEPT_LANGUAGE"])); // brosers use en-US, Linux uses en_US for($i=0;$i<count($BrowserLocales);$i++) { list($BrowserLocales[$i])=explode(";",$BrowserLocales[$i]); //trick for "en;q=0.8" for($j=0;$j<count($SystemLocales);$j++) { if ($BrowserLocales[$i]==substr($SystemLocales[$j],0,strlen($BrowserLocales[$i]))){ setlocale(LC_ALL, $SystemLocales[$j]); break 2; // found and set, so no more check is needed } } }
например, шахтная система обслуживает только:
и мои языки браузера: pl, en-US, en =>, поэтому единственной правильной локалью является pl_PL.UTF-8.
Когда успешное сравнение не найдено – вообще нет setlocale.
Я использую HTTP_ACCEPT_LANGUAGE
$localePreferences = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']); if(is_array($localePreferences) && count($localePreferences) > 0) { $browserLocale = $localePreferences[0]; $_SESSION['browser_locale'] = $browserLocale; }