ガイド

NodeやPHPのアプリにサーバー側のジオロケーションを追加する

パーソナライズ、初期設定、分析をはじめとするほとんどの用途では、ジオロケーションはサーバー側で行うべきものです。訪問者のブラウザの協力も、クライアント側で動くスクリプトも一切必要ないからです。

リクエストそのもの

言語にかかわらず、呼び出しは/v1/ipへの同じシンプルなHTTP GETリクエストで、キーはヘッダーで送信します。

GET /v1/ip?ip=203.0.113.60
X-API-Key: mg_live_examplekey123
{
  "status": "ok",
  "ip": "203.0.113.60",
  "version": 4,
  "found": true,
  "country": "Netherlands",
  "country_code": "NL",
  "region": "North Holland",
  "city": "Amsterdam",
  "postcode": "1012",
  "lat": 52.3702,
  "lon": 4.8952,
  "timezone": "Europe/Amsterdam",
  "asn": 3344,
  "org": "Example ISP"
}

PHPアプリの場合

リクエストから訪問者自身のアドレスを取得し(通常は$_SERVER['REMOTE_ADDR'])、ipパラメーターとして渡します。そのうえで、PHP環境ですでに使っているHTTPクライアント(curl、またはそれをラップしたライブラリ)でHTTPリクエストを送ります。このサイト自体もクライアント側のJavaScriptを使わないサーバーレンダリングのPHPで作られているため、このパターンはページの通常のレンダリングの流れに自然に収まり、ページのマークアップが生成される前に位置データを利用できます。

Nodeアプリの場合

受信したリクエストオブジェクトから訪問者のアドレスを読み取ります。一般的にはreq.socket.remoteAddress、アプリの前段にリバースプロキシがある場合はX-Forwarded-Forなどそのプロキシが設定するヘッダーです。そして、レスポンスをレンダリングする前に、好みのHTTPクライアントで同じGETリクエストを送ります。

アプリの前段にあるプロキシの扱い

アプリがロードバランサーやリバースプロキシの背後にある場合、コードが直接見るアドレスは訪問者ではなくプロキシ自身のアドレスかもしれません。接続の生のリモートアドレスに頼るのではなく、プロキシが設定する転送元アドレスのヘッダーを確認し、そのアドレスをipパラメーターとして明示的に渡してください。そうしないと、訪問者ではなく自社のインフラの位置を特定することになります。

どちらでもリクエストのコストは同じ

検索のコストは、PHPから呼び出しても、Nodeやその他のバックエンド言語から呼び出しても、同じ1リクエストです。コストは何が呼び出したかではなく、APIに届いたリクエストに結び付いているからです。どちらの言語でも、ページごとに検索を繰り返さないよう、結果をセッションの間キャッシュしてください。

サーバー側のジオロケーションは、バックエンドの言語にかかわらず同じように機能します。訪問者のアドレスを付けた1回のHTTP呼び出しです。認証方法の詳細は認証のドキュメントに、フィールドの一覧はIPv4検索のドキュメントにあります。