Управление редиректами на основе страны, в которой находится посетитель - важная штука. Основная задача такого редиректа - раскидать посетителей по различным зеркалам, чтобы разгрузить основной сервер и обеспечить посетителям более быстрый доступ к информации. Второе возможное применение - системы, пытающиеся отсечь неплатежеспособных пользователей из стран, входивших в СССР, и перенаправить их куда-нибудь подальше, а добрых кредитоспособных перцев из США и Великобритании поставить на большие бабки :).
Честно признаюсь, что столкнулся как раз со второй задачей. И успешно ее решил! Теперь все, кого сервер считает русскими, редиректятся куда подальше (кстати, та же судьба почему-то постигла и американцев, кто ж их, заказчиков, разберет), а остальные получают страничку с предложением заплатить денег.
Я рассматривал два варианта: написать собственный скрипт, который будет искать ip в базе данных по географии и затем перенаправлять посетителя, или использовать чью-то стороннюю разработку. Поскольку я ленивый товарищ, я, конечно, использовал чужое :). Чужое называется mod_geo (это модуль для Apache), и взять его можно тут: ftp://apache.lexa.ru/pub/apache-rus/contrib/mod_geo-1.3.0.tar.gz.
Итак, скачиваем и распаковываем. Видим таблицу с распальцовкой ip по странам (сразу скопируйте ее в /etc), список кодов стран (соотношения RU - Russia и так далее), и собственно файлы модуля. Сюрприз! Модуль есть и в варианте для Apache 2.x, что в условиях нехватки модулей для Apache 2 является большим плюсом; ну и, конечно, README.html. Тому, что в нем написано - не верьте! :)
Написано там, что, мол, с помощью apxs можно поставить только модуль для Apache 2, хотя обычный модуль ставится точно так же (путь к apxs вы должны подставить свой):
# /etc/httpd/bin/apxs -i -c -a mod_geo.c
После этого модуль будет скомпилирован и установлен, причем необходимые директивы LoadModule и AddModule будут прописаны в httpd.conf. Здорово, правда? Жалко что так нельзя ставить php :).
Но на этом наши мучения не кончаются. Необходимо прописать в основной части путь к таблице соответствий ip-страна и глобально отключить mod_geo (а то больно уж тормозит!):
# Путь конечно ставьте свой
GEOTable /etc/ipranges.2002-01-10
GEOActive Off
После этого мы должны настроить ту часть, которая все-таки должна работать. Достоверно известно, что директиву GEOActive можно помещать внутрь бокса VirtualHost, скорее всего, в Directory он тоже неплохо полезет (точно, написано что можно даже в htaccess его писать, только AllowOverride FileInfo), так что делаем специальную "перевалочную базу", для которой можно выделить отдельный поддомен, хотя это вовсе необязательно. Итак, внутри настроек перевалочной базы указываем:
GEOActive On
# Название переменной со страной
GEOCGIArg cnt
Стоит отметить, что mod_geo, будучи включенным, порождает переменную окружения IP_GEO, ее можно использовать для mod_rewrite или как вам захочется. Дальше пишем на пхп небольшой скрипт, перенаправляющий посетителей, причем данные о том, куда он их переправляет, он берет из текстового файла вида
RU!http://www.mail.ru
US!http://www.mail.us
...
ALL!http://www..mail.ru
Видно, что мы сначала указываем, куда переправлять конкретные страны, а потом - все остальные (ALL). Да, кто мешает добавить поддержку одновременной работы с несколькими такими базами? Передаем скрипту параметр site, который определяет, какой файл с базой редиректов брать (файлы с базами имеют названия вида table-site). В итоге скрипт получается таким:
if (empty($site))
{
$site="default";
}
$table = file("/home/geo/redirect/table-$site");
foreach ($table as $row)
{
if (ereg("(.*)\!(.*)", $row, $args))
{
if ($args[1] == $cnt)
{
header("Location: $args[2]");
exit;
}
} else
{
if ($args[1] == "ALL")
{
header("Location: $args[2]");
}
}
}
Как видите, скрипт идет сверху вниз построчно, пока не найдет в файле нужную страну, а если не находит - переправляет посетителя на дефолтный адрес. Все, после этого достаточно создать файл table-site, прописав в нем нужные редиректы, и направлять посетителей на http://redir.domain.com/redir.php?site=site, каковой адрес можно замаскировать под обычную страницу.
p.s. Да, конечно, mod_rewrite для этой цели, возможно, подойдет даже лучше :)