LaravelでサーバーIP確認とダウンロード分流を行う方法

著者:Lisa Farrell · 2026-06-01

Laravelでは同じIP情報インターフェースを2つの方法で利用できます。バックエンドはサーバー出口IPを確認し、ダウンロードページはブラウザ側で訪問者に適したノードへ分流します。

APIの説明

この記事では、サーバーIP確認と訪問者IPに基づくダウンロード分流の両方を説明します。用途が異なるため混同してはいけません。

{"ip":"185.220.236.7","country":"TW","region":"Taiwan","city":"Taipei"}

利用シーン

これらの利用シーンはIP情報インターフェースの価値を示し、サーバーIPと訪問者IPを明確に区別します。

  • これらの利用シーンはIP情報インターフェースの価値を示し、サーバーIPと訪問者IPを明確に区別します。
  • LaravelでサーバーIP確認とダウンロード分流を行う方法
  • APIの説明
  • SEOとUXの推奨事項

実装ロジック

実装前にリクエスト元を確認します。サーバーリクエストはサーバーIP、ブラウザリクエストは訪問者IPを返します。

  • 実装前にリクエスト元を確認します。サーバーリクエストはサーバーIP、ブラウザリクエストは訪問者IPを返します。
  • この記事では、サーバーIP確認と訪問者IPに基づくダウンロード分流の両方を説明します。用途が異なるため混同してはいけません。
  • 以下の例はすべて https://my.ipin.io/info を直接使用し、コメントと画面文言も現地語化しています。
  • デフォルト内容は完全で読みやすく保ち、地域別内容は拡張として扱います。検索エンジンは安定した内容を取得でき、API失敗時もページは利用できます。

コード例

以下の例はすべて https://my.ipin.io/info を直接使用し、コメントと画面文言も現地語化しています。

IpController

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Http;

class IpController extends Controller
{
    public function server()
    {
        $info = ['ip'=>'不明', 'country'=>'不明', 'region'=>'不明', 'city'=>'不明'];
        try {
            // サーバー側から /info を呼び出し、サーバー出口IPを確認します。
            $response = Http::timeout(3)->get('https://my.ipin.io/info');
            if ($response->successful()) { $info = array_merge($info, $response->json()); }
        } catch (\Throwable $e) {}
        return view('server-ip', ['info' => $info]);
    }

    public function download()
    {
        return view('download');
    }
}

server-ip.blade.php

<div class="server-ip-box">
  <h2>サーバー出口IP情報</h2>
  <p>IP:{{ $info['ip'] }}</p>
  <p>Country:{{ $info['country'] }}</p>
  <p>Region:{{ $info['region'] }}</p>
  <p>City:{{ $info['city'] }}</p>
</div>

download.blade.php

<div class="download-box">
  <a id="ipinDownloadBtn" href="/download/default/app.zip">Download</a>
  <p id="ipinDownloadNode">Default</p>
</div>
<script>
(async function () {
  const el = document.getElementById("ipinDownloadNode");
  const btn = document.getElementById("ipinDownloadBtn");
  const defaultText = "ようこそ。これはデフォルトのコンテンツです。";
const contentMap = { TW: "台湾訪問者向けコンテンツ", US: "米国訪問者向けコンテンツ", JP: "日本訪問者向けコンテンツ" };
try {
  // ブラウザ側から /info を呼び出し、訪問者IPを判定します。
  const info = await fetch("https://my.ipin.io/info").then(res => res.json());
  el.textContent = contentMap[info.country] || defaultText;
} catch (e) {
  // APIリクエスト失敗時はデフォルト値を保持します。
  el.textContent = defaultText;
}
  const nodeMap = { TW: "/download/tw/app.zip", US: "/download/us/app.zip", JP: "/download/jp/app.zip" };
  try {
    const info = await fetch("https://my.ipin.io/info").then(res => res.json());
    btn.href = nodeMap[info.country] || "/download/default/app.zip";
    el.textContent = info.country || "Default";
  } catch (e) { btn.href = "/download/default/app.zip"; }
})();
</script>

routes/web.php

use App\Http\Controllers\IpController;

Route::get('/server-ip', [IpController::class, 'server']);
Route::get('/download', [IpController::class, 'download']);

SEOとUXの推奨事項

デフォルト内容は完全で読みやすく保ち、地域別内容は拡張として扱います。検索エンジンは安定した内容を取得でき、API失敗時もページは利用できます。

よくあるミス

以下の問題は、記事の正確性、コードの実用性、API説明の信頼性に影響します。

  • 以下の問題は、記事の正確性、コードの実用性、API説明の信頼性に影響します。
  • デフォルト内容は完全で読みやすく保ち、地域別内容は拡張として扱います。検索エンジンは安定した内容を取得でき、API失敗時もページは利用できます。
  • 実装前にリクエスト元を確認します。サーバーリクエストはサーバーIP、ブラウザリクエストは訪問者IPを返します。
  • これらの利用シーンはIP情報インターフェースの価値を示し、サーバーIPと訪問者IPを明確に区別します。

まとめ

この記事では、サーバーIP確認と訪問者IPに基づくダウンロード分流の両方を説明します。用途が異なるため混同してはいけません。

よくある質問

以下の質問はこの記事専用に整理しており、実装内容と直接関係しています。

質問:なぜリクエスト元を区別する必要がありますか?
回答:サーバー呼び出しはサーバーを表し、ブラウザ呼び出しは訪問者を表すためです。
質問:なぜデフォルト内容が必要ですか?
回答:SEO、初回表示、API失敗時の安定性を守るためです。
質問:国を追加できますか?
回答:はい。マッピング表に国コードを追加します。
質問:バックエンドの動作は変わりますか?
回答:別途サーバーロジックを追加しない限り、表示だけが変わります。
質問:APIが失敗したらどうなりますか?
回答:デフォルト内容、リンク、メッセージを維持します。