Региональная привязка не очень отличается от маскирования, поэтому при чтении
данного раздела вы будете чувствовать некоторое "дежа-вю". После создания таблицы базы данных geo_target_data вы создадите класс SimpleGeoTarget, который содержит все необходимые для региональной привязки возможности.
Класс SimpleGeoTarget содержит три метода, которые могут применяться в приложениях.
• getRegion () — принимает необязательный IP-адрес и возвращает код страны для
данного IP. Если IP не задан, метод возвращает регион текущего посетителя.
• isRegion () — принимает код региона и необязательный IP-адрес. Возвращает
true, если код региона совпадает с регионом IP-адреса, и false в противном
случае. Если IP не задан, используется адрес текущего посетителя.
• importGeoTargetingData О — загружает в таблицу geo_target_data базы данных
файл региональной привязки MaxMind.
Поскольку база данных региональной привязки вряд ли будет изменяться так же
часто, как данные поискового агента, в данном случае вы не будете реализовывать
возможность автоматического обновления. Здесь просто предполагается, что вы один раз заполните базу данными региональной привязки, а затем будете периодически ее обновлять.
Мы воспользуемся бесплатной базой данных региональной привязки, предоставляемой MaxMind (http://www.maxmind.com/).
Маскирование, региональная привязка и подмена до IP 243
заголовков В конце упражнения вы проверите свою библиотеку региональной привязки, выдавая различные приветственные сообщения вашим посетителям. Посетитель из Украины получит сообщение, приведенное на рис. 11.5, а пользователь из России — Реализация региональной привязки
гься в при-1. Подключитесь к базе данных seophp, как это было сделано в предыдущем упражнении, и создайте таблицу geo_target_data. Для этого выполните следующую команду SQL:
CREATE TABLE4 geo_target_data4 (
'id' INT (11) NOT NULL AUTO_INCREMENT,
Start_Lp_text4 VARCHAR(15) NOT NULL DEFAULT ' ' ,
end_ip_textx VARCHAR(15) NOT NULL DEFAULT '1 ,
"start^p^umericr BIGINT(20) NOT NULL DEFAULT '0' ,
~end_ip_numeric' BIGINT(20) NOT NULL DEFAULT '0',
country_code * CHAR (2) NOT NULL DEFAULT '1 ,
4country_name " VARCHAR(50) NOT NULL DEFAULT " ,
PRIMARY KEY (id) ,
KEY "start_ip_numeric" (1start_ip_numeric1,"end_ip_numerio *) ,
KEY *country_code* ("eountry_code")
);
2. Создайте в папке
seophp папку с именем geo_target_data. Затем загрузите
файл http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip и
распакуйте его в эту папку. В папке geo_target_data должен появиться файл
GeoIPCountryWhois.csv.
Обратите внимание, что мы не включили файл GeoIPCountryWhois. csv в страницу
загрузки кода для данной книги. Вы должны загрузить и распаковать этот файл самостоятельно, даже если и пользуетесь загрузкой кода.
3. Добавьте в файл include/conf ig. inc.php следующие определения констант:
<?php
// определение данных для подключения к базе
define("DB_HOST", "localhost");
define("DB_USER", "seouser");
define("DB_PASSWORD", "seomaster");
define("DB_DATABASE", "seophp"); \
// имя файла региональной привязки
define('GEO_TARGETING_CSV', 'geo_target_data/GeoIPCountryWhois.csv');
?>
4. Создайте в папке include файл с именем simple_geo_target. inc .php и поместите
в него следующий код:
<?php
/*
// +
+
// | SimpleGeoTarget I
// I Класс для настройки контента для конкретных географических регионов |
// | http://www.SEOEgghead.com |
// + —+
// I Copyright (с) 2004-2006 Джейми Сирович I
// + —___ +
*/
// загрузка конфигурационного файла
require_once('config.inc.php');
// простой класс для региональной привязки
class SimpleGeoTarget
<
// возвращает true, если указанный IP находится в $country_code, иначе false
function getRegion($ip = ' ')
{
// выборка IP посетителя, если он не указан
$ip = ($ip) ? $ip : $_SERVER [' REMOTE_ADDR1 ] ;
// преобразование IP в длинную версию
$ip = sprintf("%u", ip21ong($ip));
// создание SQL-запроса для получения кода страны по указанному IP
$q = "SELECT geo_target_data. * FROM geo_target_data WHERE " .
"start_ip_numeric <= $ip AND end_ip_numeric >= $ip";
// подключение x серверу MySQL
$dbLink = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)
or die ("Невозможно подключиться: " . mysql_error());
// подключение к базе данных seophp
mysql_select_db (DB_DATABASE) or die ("Невозможно подключиться к базе данных") ;
// выполнение запроса
$tmp = mysql_query($q) ;
$result = mysql_fetch_assoc($tmp);
Маскирование, региональная привязка и подмена по IP 245
// закрытие подключения к базе данных
mysql_close($dbLink);
// возврат false при отстуствии записей в базе для данного IP
if (! $result) return false;
// возврат региона
return ($result['country_code']);
}
// возвращает true, если указанный IP находится в $country_code, иначе false
function isRegion($country_code, $ip = ' ')
{
// выборка региона 4
$visitor_country_code = SimpleGeoTarget::getRegion($ip);
// возврат false, если не найден код региона
if (!$visitor_country_code) return false;
// возврат true при соответствии IP и кода страны, иначе false
return ($country_code = $visitor_country_code);
}
/* методы, применяемые для импорта базы региональной привязки */
// импорт базы данных региональной привязки MaxMind в таблицу geo_target_data
function importGeoTargetingData ()
<
// открытие файла региональной привязки
$csv_file_handle = fopen(GEO_TARGETING_CSV, 'г');
// продолжение только после успешного открытия файла БД
if (!$csv file handle)
{
echo "Невозможно открыть файл geodb.";
return;
)
// Подключение к серверу MySQL
$dbLink = mysql_connect (DB_HOST, DB_USER, DB_PASSWORD)
or die ("Невозможно подключиться: " . mysql_error ()) ;
// Подключение к базе данных seophp
mysql_select_db(DB_DATABASE) or die ("Невозможно выбрать базу данных") ;
// блокировка файла simple_geo_target для записи
mysql_query (' LOCK TABLES simple_geo_target WRITE') ;
// удаление из таблицы всех существующих элементов
$q = "DELETE FROM geo_target_data" ;
mysql_query ($q) ;
// разбор записей из файла региональной привязки и сохранение в базе данных
while (($data = fgetcsv($csv_file_handle, 10000, ",")) != false)
{
SimpleGeoTarget::_insert($data[0], $data[l], $data[2],
$data[3], $data[4], $data[5]);
}
// снятие блокировки
mysql_query('UNLOCK TABLES');
// закрытие подключения к базе данных
mysql_close($dbLink);
// закрытие дескриптора файла
fclose($csv_file_handle);
}
function _insert($start_ip_text, $end_ip_text, $start_ip_numeric,
$end_ip_numeric, $country_code, $country_name)
{
// литерализация входных данных
$start_ip_text = mysql_escape_string($start_ip_text) ;
$end_ip_text = mysql_escape_string($end_ip_text) ;
$start_ip_numeric = mysql_escape_string($start_ip_numeric) ;
$end_ip_numeric = mysql_escape_string($end_ip_numeric) ;
$country_code = mysql_escape_string($country_code);
$country_name = mysql_escape_string($country_name) ;
// создание и выполнение запроса INSERT
Sq = "INSERT INTO geo_target_data (start_ip_text, end_ip_text " .
", start_ip_numeric, end_ip_numeric, country_code, country_name)" .
"VALUES (1$start_ip_text', '$end_ip_text', '$start_ip_numeric', " .
"•$end_ip_numeric', '$country_code', '$country_name')";
mysql_query($q) ;
}
}
?>
5. Создайте в папке seophp файл geo_targeting_prepare.php и поместите в него
следующий код:
<?php
// загрузка библиотеки региональной привязки
require_once 'include/simple_geo_target.inc.php';
// обновление базы данных региональной привязки
SimpleGeoTarget::importGeoTargetingData();
echo "База данных региональной привязки обновлена!"
?>
6. Загрузите страницу http: / /seophp. example. com/geo_targeting_prepare. php.
Придется немного подождать, пока данные региональной привязки будут скопированы в вашу базу данных. На момент написания этих строк база содержит
примерно 60 ООО записей. После завершения процесса должно появиться сообщение "База данных региональной привязки обновлена!".
Учтите, что в данном сценарии для простоты выполняется удаление всех старых данных и замена их новыми.
Для проверки правильности заполнения таблицы geo_target_data можно открыть
ее для просмотра с помощью средства phpMyAdmin (рис. 11.7).
7. Теперь проверьте работу библиотеки региональной привязки на реальном примере.
Создайте в,папке seophp файл с именем get_targeting_test.php и поместите
в него следующий код:
<?php
// загрузка библиотеки SimpleGeoTarget
require_once 'include/simple_geo_target.inc.php';
// вывод приветствия с учетом региона
if (SimpleGeoTarget::isRegion("UA"))
<
echo "Привет, посетитель из Украины!";
)
else if (SimpleGeoTarget::isRegion("RU"))
{
echo "Привет, посетитель из России!";
}
else if (!SimpleGeoTarget::getRegion())
{
echo "Привет, посетитель! Мы не смогли определить код вашей страны!" ;
}
else
{
echo "Привет, посетитель! Код вашей страны: " . SimpleGeoTarget::
getRegion () ;
}
?> 8.
Теперь если Петр из Украины загрузит этот сценарий, он увидит информацию,
показанную на рис. 11.5. Если тот же самый сценарий загрузит Иван из России,
он увидит экран, приведенный на рис. 11.6.
Учтите, что при загрузке этого сценария с локальной машины ваш IP-адрес равен 127.0.0.1, а этот адрес не принадлежит никакой стране — поэтому вы получите сообщение "Привет, посетитель! Мы не смогли определить код вашей страны!" Для проверки своего региона вам нужно ввести свой сетевой IP-адрес во втором параметре метода SimpleGeoTarget::
isRegion () или в первом параметре метода SimpleGeoTarget::getRegion ().
В данном упражнении вы выдавали различные выходные данные в зависимости от
страны нахождения посетителя. Еще одним популярным применением региональной привязки является перенаправление пользователей на локализованные Web-сайты в зависимости от их регионов. Это похоже на перенаправление сайтом Google посетителей из зарубежных стран с www. google. com на соответствующие локальные версии Google.
Вот пример реализации этой возможности с помощью вашей простой библиотеки
региональной привязки. Для перенаправления французских пользователей на сайт
http: / / f г. example. com нужно сделать примерно так:
if (SimpleGeoTarget::isRegion('FR')) {
header('Location: http://fr.example.com');
exitO ;
}