Hacer una redirección por IP según el país del visitante sin afectar a los Bots

Una de las opciones que tenemos  cuando estamos usando un sistema de multitienda en el Prestashop, es la redirección por IP según sea el País de origen del visitante, por lo que debemos añadir un modulo que se cargue al iniciar el header y que realice esa redirección.

Es importante activar y bajar los ficheros necesarios en prestashop, en el apartado de geolocalización.

Una vez tengamos esto, haremos un modulo el cual tendrá este codigo

Nada mas cargar el Hook Header

 public function hookDisplayHeader()
    {
        $this->redirect();
        
    }

y añadimos la función, recuerda cambiar dominio.com por tu dominio,

public function redirect(){    
    include_once(_PS_GEOIP_DIR_.'geoipcity.inc');
    $gi = geoip_open(realpath(_PS_GEOIP_DIR_.'GeoLiteCity.dat'), GEOIP_STANDARD);
    $records = geoip_record_by_addr($gi, Tools::getRemoteAddr());
    $URL_P = $_SERVER['REQUEST_URI'];
    $pais = $records->country_code;
    //comprobamos el pais y añadimos toda EU en una sola variable CE o EU
    if ($pais == 'AD' | $pais == 'AT' |
        $pais == 'BE' | $pais == 'BG' |
        $pais == 'HR' | $pais == 'CY' |
        $pais == 'CZ' | $pais == 'DK' |
        $pais == 'EE' | $pais == 'FI' |
        $pais == 'FR' | $pais == 'DE' |
        $pais == 'GR' | $pais == 'HU' |
        $pais == 'IS' | $pais == 'IE' |
        $pais == 'IT' | $pais == 'LT' |
        $pais == 'LU' | $pais == 'MT' |
        $pais == 'NL' | $pais == 'NO' |
        $pais == 'PL' | $pais == 'RO' |
        $pais == 'SK' | $pais == 'SI' |
        $pais == 'SE' | $pais == 'CH' |
        $pais == 'TR' ){
            $pais = 'CE';
        }

       // Comprobamos que el usuario que ha conectado no un un "agente" o bot, de esta manera no vamos a redirigir a
       // a los bots de google googlebot|AdsBot-Google|Googlebot-Image|Googlebot-News|Google-Structured-Data-Testing-Tool|pagespeed|insights|
       // ni a otros bots conocidos, en esta lista solo hay algunos

       if  (isset($_SERVER['HTTP_USER_AGENT'])  && preg_match('/BotLink|ahoy|AlkalineBOT|anthill|appie|arale|araneo|AraybOt|ariadne|arks|ATN_Worldwide|Atomz
            |bbot|Bjaaland|Ukonline|borg\-bot\/0\.9|boxseabot|bspider|calif|christcrawler|CMC\/0\.01|combine|confuzzledbot|CoolBot|cosmos|
            Internet Cruiser Robot|cusco|cyberspyder|cydralspider|desertrealm, desert realm|digger|DIIbot|grabber|downloadexpress|DragonBot|
            dwcp|ecollector|ebiness|elfinbot|esculapio|esther|fastcrawler|FDSE|FELIX IDE|ESI|fido|H�m�h�kki|KIT\-Fireball|fouineur|Freecrawl|
            gammaSpider|gazz|gcreep|golem|googlebot|AdsBot-Google|Googlebot-Image|Googlebot-News|Google-Structured-Data-Testing-Tool|pagespeed|insights|griffon|Gromit|gulliver|gulper|hambot|havIndex|hotwired|htdig|iajabot|INGRID\/0\.1|Informant|
            InfoSpiders|inspectorwww|irobot|Iron33|JBot|jcrawler|Teoma|Jeeves|jobo|image\.kapsi\.net|KDD\-Explorer|ko_yappo_robot|label\-grabber|
            larbin|legs|Linkidator|linkwalker|Lockon|logo_gif_crawler|marvin|mattie|mediafox|MerzScope|NEC\-MeshExplorer|MindCrawler|udmsearch|moget|
            Motor|msnbot|muncher|muninn|MuscatFerret|MwdSearch|sharp\-info\-agent|WebMechanic|NetScoop|newscan\-online|ObjectsSearch|Occam|Orbsearch\/1\.0|
            packrat|pageboy|ParaSite|patric|pegasus|perlcrawler|phpdig|piltdownman|Pimptrain|pjspider|PlumtreeWebAccessor|PortalBSpider|psbot|Getterrobo\-Plus|
            Raven|RHCS|RixBot|roadrunner|Robbie|robi|RoboCrawl|robofox|Scooter|Search\-AU|searchprocess|Senrigan|Shagseeker|sift|SimBot|Site Valet|skymob|
            SLCrawler\/2\.0|slurp|ESI|snooper|solbot|speedy|spider_monkey|SpiderBot\/1\.0|spiderline|nil|suke|http:\/\/www\.sygol\.com|tach_bw|TechBOT|
            templeton|titin|topiclink|UdmSearch|urlck|Valkyrie libwww\-perl|verticrawl|Victoria|void\-bot|Voyager|VWbot_K|crawlpaper|wapspider|WebBandit\/1\.0|
            webcatcher|T\-H\-U\-N\-D\-E\-R\-S\-T\-O\-N\-E|WebMoose|webquest|webreaper|webs|webspider|WebWalker|wget|winona|whowhere|wlm|WOLP|WWWC|none|XGET|
            Nederland\.zoek|AISearchBot|woriobot|NetSeer|Nutch/i', $_SERVER['HTTP_USER_AGENT'] ) ){
       
       }else {  // Si no es un Bot o agente conocido se redirigira segun el pais              
            $dominiourl =$_SERVER['SERVER_NAME'];
            switch ($pais) {
                case 'ES':
                    if ($dominiourl != 'dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'uk.dominio.com' || $dominiourl == 'usa.dominio.com')
                        header("Location: https://dominio.com".$URL_P."");
                    break;
                case 'PT':
                    if ($dominiourl != 'dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'uk.dominio.com || $dominiourl == 'usa.dominio.com')
                        header("Location: https://dominio.com".$URL_P."");
                    break;
                case 'CE' :
                    if ($dominiourl != 'ce.dominio.com' || $dominiourl == 'uk.dominio.com' || $dominiourl == 'usa.dominio.com' || $dominiourl == 'dominio.com')
                        header("Location: https://ce.dominio.com".$URL_P."");
                    break;
                case 'US':
                    if ($dominiourl != 'usa.dominio.com' || $dominiourl == 'uk.dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'dominio.com')
                        header("Location: https://usa.dominio.com".$URL_P."");
                    break;
                case 'GB' :
                    if ($dominiourl != 'uk.dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'usa.dominio.com' || $dominiourl == 'dominio.com')
                        header("Location: https://uk.dominio.com".$URL_P."");
                    break;
                case 'AU':
                    if ($dominiourl != 'usa.dominio.com' || $dominiourl == 'uk.dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'dominio.com')
                        header("Location: https://usa.dominio.com".$URL_P."");
                    break;
                default :
                    if ($dominiourl != 'usa.dominio.com' || $dominiourl == 'uk.dominio.com' || $dominiourl == 'ce.dominio.com' || $dominiourl == 'dominio.com')
                        header("Location: https://usa.dominio.com".$URL_P."");
                    break;
            } 
        }
}

 

 

Deja una respuesta
You May Also Like