PHPを使用して、訪問者が私のウェブサイトでどの国から来たかを検出できるようにしたいと思います。
これをセキュリティ対策や重要なものとして使用するつもりはないことに注意してください。一部の単語のスペルを変更するだけです(アメリカ人は「登録」という単語には2 Lあると信じているようです.... crazy yanks)、そしておそらく「Select your country」リストにデフォルトのオプションを与えること。
そのため、Geolocationデータベースを使用するのは少しおおざっぱであり、新しいPHPライブラリだけをインストールするので、いじくり回したくないので、訪問者がどの国から来たのかを知る最も簡単で簡単な方法は何ですか?
保証はありませんが、ほとんどのブラウザは、米国からの場合はen-usを指定するAccept-Language HTTPヘッダーを送信します。一部の古いブラウザはenだとだけ言っていました。また、すべてのマシンが適切に設定されているわけではありません。しかし、それは良い最初の推測です。
English-UKベースのユーザーは通常、システムまたはユーザーロケールをEnglish-UKに設定します。これにより、デフォルトのブラウザー構成では、Accept Languageヘッダーとしてen-gbが必要になります。 (このen-ukの以前のバージョン。タイプミスで申し訳ありませんでした。)他の国にもen-za(南アフリカ)などのenロケールがあり、主に理論的にはen-jpのような組み合わせも可能です。
ただし、Geo-IPベースの推測は、優先される言語/ロケールでは正しい可能性が低くなります。 Googleは、IPアドレスの地理位置情報に基づくコンテンツネゴシエーションは理にかなっていると考えています。これは、日本または韓国にいるときに本当に私を困らせます...
PHPは5.3.0以降、$ _ SERVER ['HTTP_ACCEPT_LANGUAGE']変数をロケールに解析する関数を提供しています。
http://www.php.net/manual/en/locale.acceptfromhttp.php
$locale = Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']);
echo $locale; // returns "en_US"
HTTP_ACCEPT_LANGUAGE
ヘッダー($ _SERVERから)。ほとんどのブラウザーが送信します。
例として Zend_Locale をご覧ください。あるいは、libを使用することもできます。
あなたはいくつかのIP比較を行うことができますなしライブラリ全体でそれを行うことができます。
APIを使用します。これにより、ユーザー側で何も必要ありません。これは国を知らせるWeb APIです。
Example: http://api.hostip.info/get_html.php?ip=12.215.42.19
Return : Country: UNITED STATES (US)
しかし、ブラウザエージェント言語を使用することを考えましたか?あなたはそれから英語のタイプを知ることができるかもしれません。
BlockCountry と呼ばれるこのWebサイトでは、国別のIPのリストを入手できます。もちろん、ブロックする必要はありませんが、IPのリストを使用してそれらを比較できます(すべてのUS IPを取得します...)これは正確ではない可能性があります...
指定された目的を考えると、Accept-Languageヘッダーは、IPベースの地理位置情報よりも適切なソリューションです。実際、それはAccept-Languageの本来の目的です。
$ _SERVER ["HTTP_ACCEPT_LANGUAGE"]を解析して、国とブラウザのロケールを取得します
HTTP_ACCEPT_LANGUAGEを使用しています
$localePreferences = explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
if(is_array($localePreferences) && count($localePreferences) > 0) {
$browserLocale = $localePreferences[0];
$_SESSION['browser_locale'] = $browserLocale;
}
私が使用した訪問者の国を特定するために GeoIP 拡張子を使用します。
または、次の操作を実行できます。
http://www.maxmind.com/app/geoip_country から「geoip.dat」とgeoip.incをダウンロードします
geoip.incヘッダーには、その使用方法が記載されています(例:初期化と残り...)。
1つ目は、視聴者が望む言語です。2つ目は、提供できるものです。
$SystemLocales = explode("\n", Shell_exec('locale -a'));
$BrowserLocales = explode(",",str_replace("-","_",$_SERVER["HTTP_ACCEPT_LANGUAGE"])); // brosers use en-US, Linux uses en_US
for($i=0;$i<count($BrowserLocales);$i++) {
list($BrowserLocales[$i])=explode(";",$BrowserLocales[$i]); //trick for "en;q=0.8"
for($j=0;$j<count($SystemLocales);$j++) {
if ($BrowserLocales[$i]==substr($SystemLocales[$j],0,strlen($BrowserLocales[$i]))){
setlocale(LC_ALL, $SystemLocales[$j]);
break 2; // found and set, so no more check is needed
}
}
}
たとえば、鉱山システムは次の機能のみを提供します。
私のブラウザ言語は、pl、en-US、en =>なので、正しいロケールはpl_PL.UTF-8のみです。
正常な比較が見つからない場合-setlocaleはまったくありません。
GeoIPエクステンションは良い選択です。
http://countries.nerd.dk サービスは、IPから国へのマッピングに使用するサービスです。それは本当にうまく機能し、DNSに基づいているので、うまくキャッシュされます。
外部サービスに依存したくない場合は、ローカルで使用するためにデータベースをダウンロードすることもできます。