2017-09-03 2 views
-2

Je cherche à faire un lien universel qui redirige un utilisateur en fonction de leur pays. J'ai regardé MaxMind mais cherche quelque chose de libre et simple.PHP - Redirection basée sur le pays

Existe-t-il un moyen de détecter le pays utilisateur avec une précision d'au moins 80% sans recourir à un tiers?

+0

Trouvez toutes les adresses IP des pays disponibles, ajoutez-les à votre propre table et faites des demandes. –

+0

Je sais que vous avez dit pas de tiers, c'est la 3ème partie, mais c'est simple et gratuit. http://api.wipmania.com/> ajoutez l'adresse IP ici>. –

+0

Utilisez-vous CloudFlare pour votre site? Si tel est le cas, vous pouvez accéder à l'en-tête CloudFlare: '$ _SERVER [" HTTP_CF_IPCOUNTRY "]' Sinon, vous devez avoir une copie de IP-> Relations pays, celles-ci sont susceptibles de changer (?) IMO , si vous avez une copie de ceci, alors le moyen le plus rapide de faire correspondre serait d'utiliser une correspondance de la gamme: '192.168.1.0/24' par exemple –

Répondre

0

Pour implémenter votre propre produit! Vous devez créer des tables d'adresses IP par pays ...

Ou Vous pouvez simplement utiliser le plugin suivant.

Si vous souhaitez implémenter une redirection en utilisant GeoPlugin (tiers)

Voici le fichier config.php GeoPlugin

<?php 

class geoPlugin { 

    //the geoPlugin server 
    var $host = 'http://www.geoplugin.net/php.gp?ip={IP}&base_currency={CURRENCY}'; 

    //the default base currency 
    var $currency = 'USD'; 

    //initiate the geoPlugin vars 
    var $ip = null; 
    var $city = null; 
    var $region = null; 
    var $areaCode = null; 
    var $dmaCode = null; 
    var $countryCode = null; 
    var $countryName = null; 
    var $continentCode = null; 
    var $latitude = null; 
    var $longitude = null; 
    var $currencyCode = null; 
    var $currencySymbol = null; 
    var $currencyConverter = null; 

    function geoPlugin() { 

    } 

    function locate($ip = null) { 

     global $_SERVER; 

     if (is_null($ip)) { 
      $ip = $_SERVER['REMOTE_ADDR']; 
     } 

     $host = str_replace('{IP}', $ip, $this->host); 
     $host = str_replace('{CURRENCY}', $this->currency, $host); 

     $data = array(); 

     $response = $this->fetch($host); 

     $data = unserialize($response); 

     //set the geoPlugin vars 
     $this->ip = $ip; 
     $this->city = $data['geoplugin_city']; 
     $this->region = $data['geoplugin_region']; 
     $this->areaCode = $data['geoplugin_areaCode']; 
     $this->dmaCode = $data['geoplugin_dmaCode']; 
     $this->countryCode = $data['geoplugin_countryCode']; 
     $this->countryName = $data['geoplugin_countryName']; 
     $this->continentCode = $data['geoplugin_continentCode']; 
     $this->latitude = $data['geoplugin_latitude']; 
     $this->longitude = $data['geoplugin_longitude']; 
     $this->currencyCode = $data['geoplugin_currencyCode']; 
     $this->currencySymbol = $data['geoplugin_currencySymbol']; 
     $this->currencyConverter = $data['geoplugin_currencyConverter']; 

    } 

    function fetch($host) { 

     if (function_exists('curl_init')) { 

      //use cURL to fetch data 
      $ch = curl_init(); 
      curl_setopt($ch, CURLOPT_URL, $host); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
      curl_setopt($ch, CURLOPT_USERAGENT, 'geoPlugin PHP Class v1.0'); 
      $response = curl_exec($ch); 
      curl_close ($ch); 

     } else if (ini_get('allow_url_fopen')) { 

      //fall back to fopen() 
      $response = file_get_contents($host, 'r'); 

     } else { 

      trigger_error ('geoPlugin class Error: Cannot retrieve data. Either compile PHP with cURL support or enable allow_url_fopen in php.ini ', E_USER_ERROR); 
      return; 

     } 

     return $response; 
    } 

    function convert($amount, $float=2, $symbol=true) { 

     //easily convert amounts to geolocated currency. 
     if (!is_numeric($this->currencyConverter) || $this->currencyConverter == 0) { 
      trigger_error('geoPlugin class Notice: currencyConverter has no value.', E_USER_NOTICE); 
      return $amount; 
     } 
     if (!is_numeric($amount)) { 
      trigger_error ('geoPlugin class Warning: The amount passed to geoPlugin::convert is not numeric.', E_USER_WARNING); 
      return $amount; 
     } 
     if ($symbol === true) { 
      return $this->currencySymbol . round(($amount * $this->currencyConverter), $float); 
     } else { 
      return round(($amount * $this->currencyConverter), $float); 
     } 
    } 

    function nearby($radius=10, $limit=null) { 

     if (!is_numeric($this->latitude) || !is_numeric($this->longitude)) { 
      trigger_error ('geoPlugin class Warning: Incorrect latitude or longitude values.', E_USER_NOTICE); 
      return array(array()); 
     } 

     $host = "http://www.geoplugin.net/extras/nearby.gp?lat=" . $this->latitude . "&long=" . $this->longitude . "&radius={$radius}"; 

     if (is_numeric($limit)) 
      $host .= "&limit={$limit}"; 

     return unserialize($this->fetch($host)); 

    } 


} 

?> 

Et voici le code pour valider pays.

require_once('config.php'); //The above code 
$geoplugin = new geoPlugin(); 
$geoplugin->locate(); 
// create a variable for the country code 
$var_country_code = $geoplugin->countryCode; 
// redirect based on country code: 
if ($var_country_code == "OM") { 
header('Location: https:www.something.com/ae'); 
} 
else if ($var_country_code == "US") { 
header('Location: https://www.something.com/en'); 
} 
} 

Si vous n'êtes pas sûr de votre code de pays Check Here

0

Ceci est possible avec CloudFlare. Vous devez d'abord obtenir une configuration de compte CloudFlare sur votre domaine et activer la géolocalisation IP. Cela mettra un code de pays dans l'en-tête CF-IPCountry. Ensuite, vous pouvez utiliser une instruction switch php pour les redirections.

switch($_SERVER["HTTP_CF_IPCOUNTRY"]) { 
    case: "US" 
    header("Location: http://example.com/US"); 
    case: "UK" 
    header("Location: http://example.com/UK"); 
} 

En se fondant sur une tierce partie, comme CloudFlare est très probablement votre meilleur pari, comme CloudFlare ne sera pas sortir de tout temps des affaires bientôt et poignées de CloudFlare mettre à jour la liste des nouvelles adresses IP. Si vous ne voulez vraiment pas utiliser un tiers, vous pouvez toujours remplacer le $_SERVER["HTTP_CF_IPCOUNTRY"] par un autre détecteur de code de pays.

+0

Merci. Je vais jeter un oeil à cloudflare. Une idée de la précision de leur géolocalisation? – Dppal

+0

Je n'ai aucune expérience personnelle de leur géolocalisation, mais je sais que pour IPv4 c'est assez robuste, mais je ne suis pas sûr de l'IPv6. D'après mon expérience avec CloudFlare, j'imagine qu'ils auront IPv6 assez robuste trop tôt. –

0

Je suis allé avec mrredirector.com Il me permet de créer un lien universel qui redirige vers une URL basée sur le pays que j'ai spécifié.