перенаправление на поддомен

Тема в разделе "PHP", создана пользователем palbanec, 26 окт 2012.

Статус темы:
Закрыта.
Модераторы: latteo
  1. palbanec

    palbanec

    Регистр.:
    2 июл 2010
    Сообщения:
    455
    Симпатии:
    28
    Возникла задача. Есть сайт интернет магазин.Нужно создать по регионам свои магазины.С этим проблем нет.А вот как сделать, чтоб при посещении главного домена, ip определённого региона переносило пользователя сразу на поддомен(магазин его региона ip).
     
  2. tirrex

    tirrex

    Регистр.:
    9 ноя 2008
    Сообщения:
    213
    Симпатии:
    60
    функция для определению региона по ip:

    function occurrence($ip='', $to = 'utf-8')
    {
    $ip = ($ip) ? $ip : $_SERVER['REMOTE_ADDR'] ;
    $xml = simplexml_load_file('http://ipgeobase.ru:7020/geo?ip='.$ip);
    if($xml->ip->message){
    if( $to == 'utf-8' ) {return $xml->ip->message;} else {
    if( function_exists( 'iconv' ) ) return iconv( "UTF-8", $to . "//IGNORE",$xml->ip->message);else return "The library iconv is not supported by your server";}
    } else { if( $to == 'utf-8' ) {return $xml->ip->region;} else {if( function_exists( 'iconv' ) ) return iconv( "UTF-8", $to . "//IGNORE",$xml->ip->region);else return "The library iconv is not supported by your server";}}
    }

    дальше switch и редирект
     
  3. begemot3

    begemot3 Постоялец

    Регистр.:
    18 янв 2009
    Сообщения:
    52
    Симпатии:
    13
    Этот код надо вставить в самое начало файла index.php в корне сайта:

    <?php
    /**
    * Created by Alex Vertinsky
    * Date: 29.10.12
    * Time: 1:35
    * Функция возвращает данные по ip адресу
    * В качестве параметров type можно указать следующие параметры
    * country - чтобы получить название страны
    * city - чтобы получить название города
    * region - чтобы получить название региона
    * district - чтобы получить название округа
    */

    function occurrence($ip = '', $to = 'utf-8', $type = 'region')
    {
    $ip = ($ip) ? $ip : $_SERVER['REMOTE_ADDR'];
    $xml = simplexml_load_file('http://ipgeobase.ru:7020/geo?ip=' . $ip);
    // print_r($xml);
    if ($xml->ip->message) {
    if ($to == 'utf-8') {
    return $xml->ip->message;
    } else {
    if (function_exists('iconv')) return iconv("UTF-8", $to . "//IGNORE", $xml->ip->message); else return "The library iconv is not supported by your server";
    }
    } else {
    if ($to == 'utf-8') {
    return $xml->ip->$type;
    } else {
    if (function_exists('iconv')) return iconv("UTF-8", $to . "//IGNORE", $xml->ip->region); else return "The library iconv is not supported by your server";
    }
    }
    }

    $incomingIP = $_SERVER['REMOTE_ADDR'];

    $result = occurrence($incomingIP, 'utf-8','region');

    switch ($result){
    case 'Санкт-Петербург':
    header('Location: http://www.sms-pr.ru');
    break;
    case 'Детройт':
    header('Location: http://usa.sms-pr.ru');
    break;
    default:
    echo 'def';
    break;
    }



    Спасибо предыдущему автору: я использовал его функцию и чуть чуть поменял для своего удобства
    соответственно тут : 'Санкт-Петербург' перенаправит на домен www.sms-pr.ru
    и 'Детройт' перенаправит на домен http://usa.sms-pr.ru
    добавляй свои значения и регионы в таком виде:

    case 'Детройт':
    header('Location: http://usa.sms-pr.ru');
    break;
     
    Roman777 нравится это.
  4. Extalionez

    Extalionez Клоун

    Заблокирован
    Регистр.:
    21 авг 2008
    Сообщения:
    368
    Симпатии:
    185
    про exit забыли. надо примерно так.
    PHP:
    case 'Детройт':
    header('Location: http://usa.sms-pr.ru');
    exit;
    break;
     
  5. Qwest-fx

    Qwest-fx Постоялец

    Регистр.:
    3 апр 2007
    Сообщения:
    129
    Симпатии:
    39
    Если у тебя VPS, то лучше установить базу MaxMind - GeoIP, если используешь апач, то там все просто, плюсом ставишь на крон обновление, если надо высокий процент попадания в реальный регион, покупай свежую базу, или ищи её.
    Вот тут можно посмотреть как прикрутить http://dev.maxmind.com/geoip/mod_geoip2
     
  6. begemot3

    begemot3 Постоялец

    Регистр.:
    18 янв 2009
    Сообщения:
    52
    Симпатии:
    13
    Спасибо, это было бы правильнее.
    Все оставшиеся команды выполнятся и скрипт еще чутка погрузит сервер.
    я кое что еще забыл.

    Надо дописать проверку на то что юзер находится на своем регионе и не посылать его ни куда больше, иначе может зациклить в редиректе.
    <-------------- добавлено через 54 сек. -------------->
    А какого то единого централизованого GeoIP не существует?
     
  7. palbanec

    palbanec

    Регистр.:
    2 июл 2010
    Сообщения:
    455
    Симпатии:
    28
    Было бы не плохо увидеть сей код.)
     
  8. leto

    leto Постоялец

    Регистр.:
    17 авг 2011
    Сообщения:
    68
    Симпатии:
    4
    В зависимости от движка на котором создам магазин, в Drupal когда то встречал пободную реализацию
     
  9. palbanec

    palbanec

    Регистр.:
    2 июл 2010
    Сообщения:
    455
    Симпатии:
    28
    реализация нужна на openCart
     
  10. drw36

    drw36 Создатель

    Регистр.:
    11 ноя 2012
    Сообщения:
    12
    Симпатии:
    2
    ipgeobase.ru обновляет базу раз в сутки (если у них договор с руцентром, то последним не вариант загружать свои серваки лишними запросами - проще один раз базу слить). Можно, как вариант, тянуть информацию чз какой-нибудь сервис, который обращается к базам регистраторов и даёт инфу, пусть не в режиме реального времени, но всё же более достоверно. Посему такой вариант тоже имеет право на существование.
    if( $curl = curl_init() ) {
    $ip = $_SERVER["REMOTE_ADDR"];
    curl_setopt($curl, CURLOPT_URL, 'http://ip-whois.net/ip_geo.php?ip='.$_GET['ip']);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
    $out = curl_exec($curl);
    $matches = array();
    preg_match_all("/Страна: (.*)/i", $out, $matches);
    $country=$matches[1][1];

    $matches1 = array();
    preg_match_all("/Регион: (.*)/i", $out, $matches1);
    $region=$matches1[1][1];

    $matches2 = array();
    preg_match_all("/Город: (.*)/i", $out, $matches2);
    $town=$matches2[1][1];
    curl_close($curl);
    //$town=substr($town,0,strlen($town)-3);
    }
    echo "Страна: $country";
    echo "Регион: $region";
    echo "Город: $town";
     
Статус темы:
Закрыта.