Студия веб дизайна Original - создание сайтов, web дизайн, создание логотипа, оригинальный дизайн, редизайн, интернет реклама
Студия веб дизайна Original - создание сайтов, web дизайн, создание логотипа, оригинальный дизайн, редизайн, интернет реклама
Студия веб дизайна Original - создание сайтов, web дизайн, создание логотипа, оригинальный дизайн, редизайн, интернет реклама

Управление редиректами на основе страны, в которой находится посетитель - важная штука. Основная задача такого редиректа - раскидать посетителей по различным зеркалам, чтобы разгрузить основной сервер и обеспечить посетителям более быстрый доступ к информации. Второе возможное применение - системы, пытающиеся отсечь неплатежеспособных пользователей из стран, входивших в СССР, и перенаправить их куда-нибудь подальше, а добрых кредитоспособных перцев из США и Великобритании поставить на большие бабки :).

Честно признаюсь, что столкнулся как раз со второй задачей. И успешно ее решил! Теперь все, кого сервер считает русскими, редиректятся куда подальше (кстати, та же судьба почему-то постигла и американцев, кто ж их, заказчиков, разберет), а остальные получают страничку с предложением заплатить денег.

Я рассматривал два варианта: написать собственный скрипт, который будет искать 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 для этой цели, возможно, подойдет даже лучше :)

Рейтинг@Mail.ru
Студия веб дизайна Original - создание сайтов, web дизайн, создание логотипа, оригинальный дизайн, редизайн, интернет реклама
Студия веб дизайна Original - создание сайтов, web дизайн, создание логотипа, оригинальный дизайн, редизайн, интернет реклама
Студия веб дизайна Original - создание сайтов, web дизайн, создание логотипа, оригинальный дизайн, редизайн, интернет реклама
Используются технологии uCoz