LaravelでIPアドレスを元にロケール判別する方法について調べた事をまとめます。
この記事の内容
IPアドレスによるロケール判別の基礎
IPアドレスは地域インターネットレジストリ- Regional Internet Registry(RIR) -(Wikipedia参照)という団体によって管理されており、IPアドレスは地域ごとに割り当てられています。
この団体が管理するデータベースを使うことで、IPアドレスから地域を判別する事が可能になります。
IPアドレスによるロケール判別ができるサービス
IPアドレスを検索するサービスが民間、個人で提供されています。
以下その1例です
- IPひろば… 有料、無料版があり、無料版では国までの検索が利用可能です。 有料版は都道府県や組織名、従業員数まで参照できるようです。
- IPアドレスから住所検索: 国/地域の特定 | ラッコツールズ🔧 … ドメイン販売の会社が無償で提供しているIPアドレス検索ツールです。
その他、個人で運営しているウェブサイトもちらほら存在します。
仕組みとしてはRIRで提供されているデータベースと照合するという方法になっている思われます。
IPアドレスによるロケール判別API
自分のアプリケーションで実装する場合もRIRからデータを取得し、IPアドレスを照合するという方法で実装できそうですが、楽できる方法があるなら利用したいところです。
有名なのがMaxMindが提供しているGeoLite2というデータベースおよびAPIです。
GeoLite2 Free Downloadable Databases « MaxMind Developer Site
有料版もありますが、無料版でも地域の特定には十分と思われます。
ライセンス表記すれば商用利用も可という事で、これを使うのが楽そうです。
PHPライブラリは以下となっています。
maxmind/GeoIP2-php: PHP API for GeoIP2 webservice client and database reader
Laravel用 GeoLite2 パッケージ
GeoLite2のAPIをLaravelで簡単に使えるようにパッケージを作っている方がいらっしゃいました。
danielme85/laravel-geoip2: Service provider and DB downloader for Maxminds PHP API GeoIP2.
こちらを利用させて頂きます。
Laravelを使わない素のPHPでの使い方はこちら
使い方はREADMEにある通りなのですが、英語なのでいちおう翻訳しつつ説明します。
以下、Laravel6.2で動作確認済です。
インストール
composer.jsonに以下を追加します。
"require": {
"danielme85/laravel-geoip2": "dev-master",
....
}
またはコマンドでインストールします。
> composer require danielme85/laravel-geoip2
GeoLite2のライセンスキー取得
GeoLite2のウェブサイトからライセンスを取得します。
GeoLite2 Free Downloadable Databases « MaxMind Developer Site
「SIGN UP FOR GEOLITE2のボタンをクリック。

必要事項を記入していきます。


メールで届いたリンクをクリックするとパスワード登録フォームが表示されます。

パスワードを設定したらログインします。

ログインするとこんな画面になります。

左側のメニューの「My License Key」を選択し、「Generate new license key」ボタンをクリック。

「License key description」にキーの名前をを入れます。
「Will this key be for GeiIP Update?」はYesにしておきます。データベースを自動更新するツールがあるようで、このライセンスキーを更新ツールに使うか聞かれているようです。
「Generate a license key and config file for use with geoipupdate version 3.1.1 or newer」にチェックを入れます。新しいバージョンのツールを使うか、古いバージョンを使っているかを選ぶようです。

Confirmを押すとライセンスキーが発行されます。

.envにGEOIP2のライセンスキーを設定する
Laravelの.env
ファイルにGeoIP2のライセンスキーを設定します。
GEOIP2_LICENSE=XXXXX
configファイルの配置
以下のコマンドでlaravel-geoip2の設定ファイルを自分のプロジェクトに配置します。
> php artisan vendor:publish --provider="danielme85\Geoip2\Geoip2ServiceProvider"
コピーされた設定ファイルは以下のようになっています。
'https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&suffix=tar.gz', //url db file download 'folder' => 'app/geoip2', //storage location folder to store Geoip2 files. 'filename' => 'GeoLite2-City.mmdb', 'localhost' => '8.8.8.8', //when running on localhost (or for general testing) you can specify a fake ip address here. 'license' => env('GEOIP2_LICENSE', '') ];
GeoIPデータのダウンロード
下記コマンドでGeoIPデータをダウンロードします。
> php artisan geoip:download
storage/app/geoip2
以下にgeoipファイルがダウンロードされます。
動作確認
以下のようにして国コードを取得できます。
use danielme85\Geoip2\Facade\Reader;
$reader = Reader::connect();
$result = $reader->city('xxx.xxx.xxx.xxx'); // グローバルIPを指定
echo $result->country->isoCode;
IPアドレスから「JP」や「US」といった国コードを取得できるようになりました。
他にも都道府県、市区町村、郵便番号なども取得できます。
郵便番号は多少ズレます。
国コードと言語コード
国コードが決まっても、言語が決まるわけではありません。その逆も然りです。
日本の場合は日本=日本語として問題ありませんが、国によっては複数の公用語を持っている場合があります。
複数の国で使われている言語もあります。英語がその代表です。
言語の決定についてはある程度ルールを決めて自動的に言語を割り当てるか、ユーザーが選択可能にするか、アプリケーションごとの検討事項になると思います。
ロケール判別について調べた事は以上です。
コメント/ピンバック
[…] LaravelでIPアドレスを元にロケール判別する […]
[…] LaravelでIPアドレスを元にロケール判別するLaravelでIPアドレスを元にロケール判別する方法について調べた事をまとめます。mrkmyki.com2020.01.20 […]