file_get_contents(' http://api.hostip.info/country.php )) を実行すると、訪問者の国ではなく、Webサーバーの国が確実に返されますか?
以前は IP2Nation を使用していましたが、最近不正確であることが判明したため、これに切り替えました。
http://dev.maxmind.com/geoip/legacy/geolite/
この例では、国のデータを CSV 形式でダウンロードしました: http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
次に、このデータを次のように mysql テーブルに入れます
CREATE TABLE `geoip` (`ipstart` int(10) unsigned NOT NULL, `ipend` int(10) unsigned NOT NULL, `code` char(2) NOT NULL, PRIMARY KEY (`ipstart`,`ipend`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `geoip` (`ipstart`, `ipend`, `code`) VALUES (16777216, 16777471, 'au'),
(16777472, 16778239, 'cn'),
(16778240, 16779263, 'au'),
etc...
$_SERVER["REMOTE_ADDR"] は、たとえば誰かがプロキシの背後にいる場合、常に正しい IP アドレスを返すとは限りません。この関数を使用して、訪問者の実際の IP アドレスを (可能な限り) 決定できます。
function get_real_ip () {
if (!empty ($_SERVER['HTTP_X_FORWARDED_FOR'])) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
} elseif (!empty ($_SERVER['HTTP_CLIENT_IP'])) {
return $_SERVER['HTTP_CLIENT_IP'];
}
return !empty ($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
}
次に、次のような PHP 関数を使用して顧客の国を取得できます。
function get_country_by_ip ($ip) {
$ip = ip2long ($ip);
$sql = 'SELECT code FROM geoip WHERE ipstart <= ' . $ip . ' AND ipend >= ' . $ip . ' LIMIT 1';
// Get result of mysql query and return it here
}
したがって、最終的なコードは次のようになります。
define ('COUNTRY_CODE_US', 'us');
if (get_country_by_ip (get_real_ip () == COUNTRY_CODE_US) {
// load script for US user;
} else {
// load script for users from other countries
};
このソリューションには、米国だけでなく、さまざまな国のユーザーに対してさまざまなことを実行できるという利点があり、失敗する可能性のあるサードパーティの Web サイト/API への呼び出しに依存していません。