PHP - 基于国家/地区的重定向

时间:2017-09-03 15:42:46

标签: php

我希望制作一个通用链接,根据用户的国家/地区重定向用户。我看过MaxMind,但我正在寻找一些免费且简单的东西。

有没有办法在不使用第三方的情况下以至少80%的准确率检测用户所在国?

3 个答案:

答案 0 :(得分:1)

CloudFlare可以实现这一点。首先,您需要在您的域上设置CloudFlare帐户,并启用IP地理位置。这将把国家代码放在CF-IPCountry标题中。然后你可以使用php switch语句进行重定向。

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

依靠CloudFlare等第三方最有可能是您最好的选择,因为CloudFlare不会很快停止营业,CloudFlare会处理使用新IP更新列表。如果您确实不想使用第三方,则始终可以使用其他国家/地区代码检测器替换$_SERVER["HTTP_CF_IPCOUNTRY"]

答案 1 :(得分:0)

实施自己的!你必须制作一个国家明智的IP地址表...

或者您只需使用以下插件即可。

如果您想使用GeoPlugin(第三方)实施重定向

这是GeoPlugin config.php文件

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

    }


}

?>

以下是验证国家/地区的代码。

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

如果您不确定自己的国家/地区代码Check Here

答案 2 :(得分:-1)

我选择了mrredirector.com它允许我创建一个通用链接,根据我指定的国家/地区重定向到网址。