TDS (Система управления трафиком) своими руками

Light TDS

Здравствуйте мои любители этого интересного.

Сегодня я расскажу вам, как можно самому, на коленке, организовать себе систему управления трафиком.

Итак, начнем

Прежде всего нам требуется определить, по каким критериям будем фильтровать траф... Я предлагаю сделать по самому распространенному: уникальность и страна пользователя.

Первым делом нам потребуется определять уникальность трафа. По хорошему счету уникальность определяется рядом параметров: IP, броузер, операционная система. Но мы пока не будем вдаваться в такие дебри и будем определять уникальность просто по броузеру, т.е. ставить свои куки пользователю

Первая функция определяет уникальность трафа

 
function is_uniq()
 
{
 
if(isset($_COOKIE['is_uniq']))
 
return 0;
 
else

{

setcookie('is_uniq', $_SERVER['REMOTE_ADDR'], time()+60*60*24);
 
return 1;
 
}
 
}

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

Следующий шаг - это определение страны пришедшего

Для этого нам потребуется база соответствия IP адресов и стран. Самый лучший вариант заюзать базу GeoIP от пацанов из MaxMind, за что им отдельный респектос. Базу эту можно либо купить, либо использовать Light версию (фришную). Мы конечно используем бесплатную. По заявлениям разработчиков этой базы, они правильно определяют до 98% всех IP адресов... Что же, довольно не плохо. Вот с этой страницы мы можем скачать саму базу (в бинарном виде). Дальше нам надо получить API для работы с этой базы, используем php, поэтому вот тут можем скачать API для работы с бинарной базой.

Определение страны сводится к следующему коду

 
require_once("./inc/geoip/geoip.inc");
 
$gi = geoip_open("./inc/geoip/geoip.dat",GEOIP_STANDARD);
 
$ip = $_SERVER['REMOTE_ADDR'];
 
$code = geoip_country_code_by_addr($gi, $ip);
 
$code = strtoupper($code);

Теперь в переменой $code хранится двухбуквенный код страны.

Теперь сравнивая это значение с теми, которые нам нужны (US - америка, CA - канада, GB - велибритания), мы можем сортировать траф.

 
$default_url = 'http://google.com';//урл по дефолту, если правило не найдено$rules = array();
 
$rules['US'][1] = 'http://url-for-us-unq.com';//uniq
 
$rules['US'][0] = 'http://url-for-us-raw.com';//raw

Дальше надо проверить наличие правила для кода страны

 
$type = is_uniq();
 
foreach ($rules as $country=>$urls)
 
{
 
if($country == $code)
 
{
 
header("Location: ".$urls[$type]);
 
die();
 
}
 
}

Если не найдено правило, то редиректим по дефолтному урлу

 
header("Location: ".$default_url);
 
die();

Итак, в итоге, мы получили вот такой скрипт

  1.  
  2. require_once("./inc/geoip/geoip.inc");
  3.  
  4. $gi = geoip_open("./inc/geoip/geoip.dat",GEOIP_STANDARD);
  5.  
  6. $ip = $_SERVER['REMOTE_ADDR'];
  7.  
  8. $code = geoip_country_code_by_addr($gi, $ip);
  9.  
  10. $code = strtoupper($code);
  11.  
  12. function is_uniq()
  13.  
  14. {
  15.  
  16. if(isset($_COOKIE['is_uniq']))
  17.  
  18. return 0;
  19.  
  20. else
  21. {
  22. setcookie('is_uniq', $_SERVER['REMOTE_ADDR'], time()+60*60*24);
  23.  
  24. return 1;
  25.  
  26. }
  27.  
  28. }
  29.  
  30. $default_url = 'http://google.com';
  31.  
  32. $rules = array();
  33.  
  34. $rules['US'][1] = 'http://url-for-us-unq.com';//uniq
  35.  
  36. $rules['US'][0] = 'http://url-for-us-raw.com';//raw
  37.  
  38. //...........
  39.  
  40. $type = is_uniq();
  41.  
  42. foreach ($rules as $country=>$urls) { if($country == $code) {
  43.  
  44. header("Location: ".$urls[$type]);
  45.  
  46. die();
  47.  
  48. }
  49.  
  50. }
  51.  
  52. header("Location: ".$default_url);
  53.  
  54. die();

Этот же скрипт можно скачать в архиве с базой GeoIP прямо здесь (файл tds 460Кб)

В посте использовались небольшие кусочки скрипта, работающего на моей разработке LightTDS

1 Star2 Stars3 Stars4 Stars5 Stars (2 votes, average: 5 out of 5)

Loading ... Loading ...

7 Responses to “TDS (Система управления трафиком) своими руками”

  1. EmmetBraun Says:

    Респект, спасибо!
    $rules[’$Country’][1] = ‘http://url-for-us-unq.com’;
    $rules[’$Country][0] = ‘http://url-for-us-raw.com’;

    где $Country будет страна, устанавливаемая пользователем. Так можно?

  2. admin Says:

    не совсем, массив $rules надо самому задавать, в нем хранятся страны и урлы на которые делать переходы

  3. EmmetBraun Says:

    Респект, спасибо!
    $rules[’$Country1’][1] = ‘$link1′;
    $rules[’$Country2’][0] = ‘$link2’;

    где $Country будет страна, устанавливаемая пользователем. $Link линка устанавливаемая пользователем. Так можно?

  4. admin Says:

    а код страны мы получаем в переменную $code, и вот с ней и надо сравнивать те значения из массива, которые мы установили

  5. admin Says:

    массив не надо редактировать :)
    его заполняешь как тебе надо, чтобы редиректы правильно были, например ты собираешься слать америку и канаду на фарма шоп, а россию на яндекс :), в таком случае массив $rules будет выглядеть следующим образом
    $rules[’US’][1] = ‘хttp://pharma-shop1.com’;
    $rules[’US’][0] = ‘хttp://pharma-shop2.com’;
    $rules[’CA’][1] = ‘хttp://pharma-shop1.com’;
    $rules[’CA’][0] = ‘хttp://pharma-shop2.com’;
    $rules[’RU’][1] = ‘хttp://ya.ru’;
    $rules[’RU’][0] = ‘хttp://ya.ru’;

  6. Artur Says:

    А мне больше нравится kalisto TDS :-)
    Там главное часть скрипта переписать, а то нагрузка огромная на MySQL Идет =)))

  7. admin Says:

    На вкус и цвет… все фломастеры разные :)
    А вот у меня как раз сделано без использования mysql, только текстовые файлы ;)

Leave a Reply