Автоматическая переадресация по ip адресу

Тема в разделе "Коммерческие", создана пользователем r0nin, 17 авг 2010.

Информация :
Публиковать (для всех) нуленые версии, особенно от modulesgarden КАТЕГОРИЧЕСКИ не стоит. Тема мониторится оным разработчиком, а к нам приходят абузы которые нельзя игнорировать.
Статус темы:
Закрыта.
Модераторы: Amazko, Aste
  1. r0nin

    r0nin Постоялец

    Регистр.:
    12 апр 2010
    Сообщения:
    80
    Симпатии:
    4
    Приветы.
    Стоит wordpress. Хотелось бы узнать как сделать так чтоб когда пользователь заходил на сайт он автоматически редиректился на другой сайт или поддомен той страны откуда он зашёл.
    Т.е. у сайта есть несколько клонов например в других доменных зонах - и вот когда заходят с Росси редиректит на *.ru с Украины на *.ua и т.д.
    Так например в гугле:)
     
  2. webpirat777

    webpirat777

    Регистр.:
    25 апр 2009
    Сообщения:
    203
    Симпатии:
    80
    Пропишите переадресацию используя Б.Д Maxmind.
    http://www.maxmind.com/app/geolitecountry
    Бесплатная 99,5% точности, платная 99,8%.
    Обновлять нужно раз в месяц.
    Если сложно разобраться, могу выложить свое решение, но попозже. Сейчас физически не могу.
     
  3. r0nin

    r0nin Постоялец

    Регистр.:
    12 апр 2010
    Сообщения:
    80
    Симпатии:
    4
    Каким образом надо прописывать переадресацию.
    Насколько я понял можно установить на Апач или через Пхп.
     
  4. webpirat777

    webpirat777

    Регистр.:
    25 апр 2009
    Сообщения:
    203
    Симпатии:
    80
    В общем можно сделать разными методами, например по языку браузера и т.п.
    Лично я прописал по IP, и считаю что это наиболее лучший и точный вариант.
    Вот мое решение:

    Код:
    <?php
    require_once("geoip.inc");
    $gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
    $country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
    geoip_close($gi);
    if ($country_code == 'RU') //код страны
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://ru.site.com'); // сайт для страны.
    }
    if ($country_code == 'UA') //код страны
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://ua.site.com'); // сайт для страны.
    }
    else
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://en.site.com'); // сайт, на который перейдет посетитель, если для его страны нет отдельного сайта.
    }
    ?>
    Данный метод я писал для поддоменов, то есть в моем случае это index.php в корне, который производит переадресацию на поддомены типа ru.site.com, ua.site.com и так далее. Можно применить и к сайтам в папках типа site.com/ru, site.com/ua и подобным. То есть сайт в данном случае расположен не в корневой директории.
    Если же сайт расположен в корневой директории, и таких сайтов несколько (по колличеству стран), то необходимо файл назвать не index.php, а любым другим именем, например redirect.php и прописать в .htaccess в качестве индексного файла redirect.php.
    Для этого в самом верху .htaccess добавим инструкцию:
    Код:
    DirectoryIndex redirect.php
    А в файле переадресации к адресам сайтов добавим тот файл, который является индексным файлом сайта, например index.php (если этого не сделать, будет редиректить на редирект бесконечно:(

    Код:
    <?php
    require_once("geoip.inc");
    $gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
    $country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
    geoip_close($gi);
    if ($country_code == 'RU') //код страны
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://site.ru/index.php'); // сайт для страны.
    }
    if ($country_code == 'UA') //код страны
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://site.ua/index.php'); // сайт для страны.
    }
    else
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://site.com/index.php'); // сайт, на который перейдет посетитель, если для его страны нет отдельного сайта.
    }
    ?>
    В самом файле можно добавить любое колличество сайтов для переадресации по странам.
    Все файлы должны лежать в корне, в противном случае необходимо прописать переадресацию на папку с этими файлами. Допустим файлы лежат в папке "redirect" и имя php-файла index.php. Создаем в корне redirect.php с переадресацией на папку "redirect", в которой происходит обработка IP посетителей:
    Код:
    <?php 
    header("Location: http://site.com/redirect"); 
    ?>
    В этом случае .htaccess инструкция остается без изменений:
    Код:
    DirectoryIndex redirect.php
    Содержимое файла site.com/redirect/index.php:

    Код:
    <?php
    require_once("geoip.inc");
    $gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
    $country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
    geoip_close($gi);
    if ($country_code == 'RU') //код страны
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://site.ru/index.php'); // сайт для страны.
    }
    if ($country_code == 'UA') //код страны
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://site.ua/index.php'); // сайт для страны.
    }
    else
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://site.com/index.php'); // сайт, на который перейдет посетитель, если для его страны нет отдельного сайта.
    }
    ?>
    Файлы GeoIP.dat (за август 2010) + geoip:
    http://depositfiles.com/files/3gsa3dvma
    Раз в месяц необходимо обновлять GeoIP.dat отсюда:
    http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
    Как видите вордпресс здесь непричем. Работает всегда и везде.
     
  5. marathoneer1

    marathoneer1 Читатель

    Заблокирован
    Регистр.:
    13 авг 2010
    Сообщения:
    13
    Симпатии:
    6
    Делал для клиента, переход на ru сайт если клиент из России. Через GEOIP базу данных:
    Собственно качаем базу.
    http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
    Получил чудо файл с 10МБ размером, ессно при большом колличестве обращений к сайту, не вариант загонять даже в базу данных. Есть *.dat формат, но он не прозрачен, и новичку трудно с ним работать (нужно разобраться в API что предлагает GEOIP бесплатно)
    Покажу пример как все выполнено в прозрачном cvs формате:
    1) На любой линукс/фрибсд системе парсим получая на выходе базу данных российских IP:
    cat GeoIPCountryWhois.cvs|grep Russian Federation >> russian_ip.cvs
    Получишь 500КБ, но все еще много лишнего в файле, уменьшаем дальше
    PHP:
    <?php
    $db_file
    file('russian_ip.cvs');
    $result_file=fopen("russian_iponly.db","w+");
    for (
    $i=0;$i<count($db_file);$i++)
        {
        
    $marker1=strpos($db_file[$i],"\",\"");
        
    $marker2=strpos($db_file[$i],"\",\"",$marker1+1);
        
    $marker3=strpos($db_file[$i],"\",\"",$marker2+1);
        
    $marker4=strpos($db_file[$i],"\",\"",$marker3+1);
    $ip_start=substr($db_file[$i],$marker2+3,$marker4-$marker3-3);
    $ip_end=substr($db_file[$i],$marker3+3,$marker4-$marker3-3);
        
    $db_start_end[$i]=$ip_start.".".$ip_end;
        if (
    $i<(count($db_file)-1)) $db_start_end[$i]= $db_start_end[$i]."\n";
        
    fwrite($result_file,$db_start_end[$i]);
        }
    fclose($result_file);
    echo 
    "\nDone!";
    ?>
    Получили базу данных IP адресов (точнее диапазонов) в long формате, вам не обязательно знать что это такое :) Просто иной вид отображения IP адреса.
    Размер 82КБ. Можно автоматизировать сей процесс, либо вобще закинуть в MYSQL, но у меня задача была сделать сей процесс наиболее прозрачным для новичка.
    Далее собственно то что должно быть на сайте
    файлик с функцией function_ifiprussian.php
    PHP:
    <?php
    function checkifiprussian ($iptocheck)
        {
        
    $check_result=FALSE;
        
    $iptocheck=ip2long($iptocheck);
        if (
    $iptocheck==-1) return;
            
    $russianipdb=file("russian_iponly.db");
        
    $i=0;
        while (
    $i<count($russianipdb))
            {
            
    $start_ip=substr($russianipdb[$i],0,strpos($russianipdb[$i],"."));
            
    $end_ip=substr($russianipdb[$i],strpos($russianipdb[$i],".")+1);
            if (
    $iptocheck>$start_ip && $iptocheck<$end_ip
                {
                
    $check_result=TRUE;
                
    $i=count($russianipdb);
                }
            
    $i++;
            }
        return 
    $check_result;
        }
    ?>
    Ну и теперь как с ним работать, предположим в верхушке index.php кладем такое:
    PHP:
    <?php
    include_once('function_ifiprussian.php');
     if (!empty(
    $_SERVER['HTTP_CLIENT_IP']))   //check ip from share internet
        
    {
          
    $client_ip=$_SERVER['HTTP_CLIENT_IP'];
        }
        elseif (!empty(
    $_SERVER['HTTP_X_FORWARDED_FOR']))   //to check ip is pass from proxy
        
    {
          
    $client_ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
        }
        else
        {
          
    $client_ip=$_SERVER['REMOTE_ADDR'];
        }
    $client_russian=checkifiprussian($client_ip);
    if (
    $client_russian==TRUE) {echo "RUSSIAN";}
    if (
    $client_russian==FALSE) {echo "NOTRUSSIAN";}
    ?>
    Последние 2 строчки собственно и проверят из какой страны клиент, и вместо echo "russian"; или echo "notrussian"; ты можешь вставить либо редирект, либо любое другое действие которое тебе нужно.

    Вот собственно и все. Данный мост можешь рассматривать как общую информацию, и завернуть скрипт под твои нужды, думаю все шаги предельно ясны и прозрачны.

    Добавлено через 5 минут
    Ах да, забыл добавить. Если у Вас есть доступ к модулям апача (или хостер может по требованию подключить таковой), самое прямое рещение - подключить опять же бесплатный модуль GEOIP в апаче и будут доступны переадресации через .htaccess.

    Но если Вы не владелец сервера, мало вероятно что хостер ответит положительно на такую просьбу. Да и как описал выше, реализовать сию задачу на PHP - проще простого.
     
    r0nin нравится это.
  6. webpirat777

    webpirat777

    Регистр.:
    25 апр 2009
    Сообщения:
    203
    Симпатии:
    80
    Я так понимаю не смог разобраться?
    Что конкретно вызывает сложности?
     
  7. r0nin

    r0nin Постоялец

    Регистр.:
    12 апр 2010
    Сообщения:
    80
    Симпатии:
    4
    Я пока не внедрял, но вот как я понял.
    Кстати мне тоже на поддомены нужно редиректить. Но в данном случае у меня и в корне тоже есть сайт.
    Итак.
    Создаём .htaccess - с содержанием
    Код:
    DirectoryIndex redirect.php
    Там же создаём redirect.php с содержанием -
    Код:
    <?php
    require_once("geoip.inc");
    $gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
    $country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
    geoip_close($gi);
    if ($country_code == 'RU') //код страны
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://ru.site.com'); // сайт для страны.
    }
    if ($country_code == 'UA') //код страны
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://ua.site.com'); // сайт для страны.
    }
    else
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://en.site.com'); // сайт, на который перейдет посетитель, если для его страны нет отдельного сайта.
    }
    ?>
    Туда же кидаем geoip.inc
    Вот и всё.
    Или нет ?:)
     
  8. webpirat777

    webpirat777

    Регистр.:
    25 апр 2009
    Сообщения:
    203
    Симпатии:
    80
    Не совсем так.
    GeoIP.dat в Geo.IP.zip-е, его на компьютере распаковываешь и тоже кидаешь вместе с geoip.inc-ом туда же.
    Но код в redirect.php для сайта в корне возьми с индексом в конце, а то получится бесконечный редирект на редирект. То есть с таким кодом редиректит на сайт, а заходя на сайт .htaccess первым открывает redirect.php, тот в свою очередь редиректит снова на сайт, на котором снова .htaccess первым открывает redirect.php и так до бесконечности.
    Здесь надо приписать index.php :

    Код:
    header('Location: http://site.com'); // сайт для страны.
    То есть получится:
    Код:
    header('Location: http://site.com/index.php'); // сайт для страны (в корне).
    Для поддоменов дописывать index.php необязательно, потому что у нас там нет редиректа в самом поддомене.
    Общий вид будет такой:
    Код:
    <?php
    require_once("geoip.inc");
    $gi = geoip_open("GeoIP.dat",GEOIP_STANDARD);
    $country_code = geoip_country_code_by_addr($gi, $_SERVER['REMOTE_ADDR']);
    geoip_close($gi);
    if ($country_code == 'RU') //код страны
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://site.com/index.php'); // сайт для страны RU (в корне).
    }
    if ($country_code == 'UA') //код страны
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://ua.site.com'); // сайт для страны UA (в поддомене).
    }
    else
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://site.com/index.php'); // сайт, на который перейдет посетитель, если для его страны нет отдельного сайта. В данном случае идет в корень, в корне сайт RU.
    }
    ?>
    
    По колличеству поддоменов можно добавить:
    Код:
    if ($country_code == 'UA') //код страны. В geoip.inc можно посмотреть коды стран. UA - код Украины, DE - Германии и т.п.
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://ua.site.com'); // сайт для страны указанной в $country_code == 'UA' - UA (в поддомене).
    }
    
    Китайцев можешь слать сюда :) :
    Код:
    if ($country_code == 'CN')
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://google.cn');
    }
    
    Или если нет страны посетителя можешь отправить его в гугль:
    Код:
    else
    {
            header("HTTP/1.1 301 Moved Permanently");
            header('Location: http://google.com');
    }
    
     
Статус темы:
Закрыта.