Dppal
Dppal

Reputation: 43

PHP - Redirect based on country

I am looking to make a universal link which redirects a user based on their country. I have looked at MaxMind but am looking for something free and simple.

Is there any way of detecting the user country with at least 80% accuracy without using a third party?

Upvotes: 1

Views: 7710

Answers (2)

Phoebe
Phoebe

Reputation: 108

This is possible with CloudFlare. First you need to get a CloudFlare account setup on your domain, and have IP Geolocation enabled. This will put a Country Code in the CF-IPCountry header. Then you could use a php switch statement for redirects.

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

Relying on a third party such as CloudFlare is most likely your best bet, as CloudFlare won't be going out of business anytime soon, and CloudFlare handles updating the list with new IPs. If you really don't want to use a third party, you can always replace the $_SERVER["HTTP_CF_IPCOUNTRY"] with a different country code detector.

Upvotes: 1

Akshay N Shaju
Akshay N Shaju

Reputation: 355

To implement your own ! You have to make a tables of country wise IP addresses ...

Or Simply you can use the following plugin.

If you want to implement a redirect using GeoPlugin (Third Party)

Here is the GeoPlugin config.php file

<?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) );

    }


}

?>

And Here is the code to Validate country.

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');
}
}

If you are not sure about your country code Check Here

Upvotes: 3

Related Questions