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

著者:Lisa Farrell·2026-06-01

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

設計目標

「LaravelでサーバーIP確認とダウンロード分流を行う方法」では、IP リクエストが完了する前からページが役立つ状態である必要があります。位置情報は補助データとして検証し、限定した一つの判定だけに使い、不完全な場合は採用しません。

リクエストと判定の流れ

LaravelでサーバーIP確認とダウンロード分流を行う方法: 次の流れはこの実装専用であり、一般的な IP 検索チェックリストの使い回しではありません。

  1. 手順 1 — 既定状態: two explicit services
  2. 手順 2 — リクエスト: Http + Cache
  3. 手順 3 — 検証: allowlisted mirror map
  4. 手順 4 — 判定: temporarySignedRoute
  5. 手順 5 — フォールバック: mirror=global

本番運用を意識した実装例

LaravelでサーバーIP確認とダウンロード分流を行う方法: この例にはタイムアウト、レスポンス検証、決定的なフォールバック、フレームワーク固有のライフサイクル処理を含めています。

<?php
// config/downloads.php
return [
  'default' => 'global',
  'country_to_mirror' => ['JP'=>'asia', 'KR'=>'asia', 'DE'=>'eu', 'FR'=>'eu'],
  'mirrors' => [
    'global' => 'https://cdn.example.com/app.zip',
    'asia'   => 'https://asia.example.com/app.zip',
    'eu'     => 'https://eu.example.com/app.zip',
  ],
];

// app/Http/Controllers/DownloadResolverController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\URL;

final class DownloadResolverController extends Controller
{
    public function __invoke(Request $request)
    {
        $country = strtoupper((string) $request->query('country', 'ZZ'));
        $key = config("downloads.country_to_mirror.$country", config('downloads.default'));
        abort_unless(array_key_exists($key, config('downloads.mirrors')), 500);

        return response()->json([
            'mirror' => $key,
            'url' => URL::temporarySignedRoute(
                'download.file', now()->addMinutes(10), ['mirror' => $key]
            ),
        ]);
    }
}

// routes/web.php
Route::get('/download/resolve', DownloadResolverController::class);
Route::get('/download/{mirror}', function (string $mirror) {
    abort_unless(request()->hasValidSignature(), 403);
    $url = config("downloads.mirrors.$mirror");
    abort_unless($url, 404);
    return redirect()->away($url);
})->name('download.file');

テストマトリクス

「LaravelでサーバーIP確認とダウンロード分流を行う方法」を公開する前に、モックレスポンスまたは制御可能な VPN 出口で次のケースを確認します。

条件入力 / 設定期待結果
T1country=JPmirror=asia; signed URL
T2country=ZZmirror=global
T3external URL inputserver map only
T4signature expiredHTTP 403

自動 / スモークテスト

public function test_unknown_country_uses_global_mirror(): void
{
    $response = $this->getJson('/download/resolve?country=ZZ');
    $response->assertOk()->assertJsonPath('mirror', 'global');
    $this->assertStringContainsString('/download/global', $response->json('url'));
}

障害時の処理

LaravelでサーバーIP確認とダウンロード分流を行う方法: 障害はログや開発者ツールで確認できるようにしつつ、空のモジュールや壊れた決済画面を利用者に見せないことが重要です。

障害原因対応
HTTP 429geo rate limitmirror=global
mirror maintenanceconfig keyremove key
signature mismatchedited / expired403 + resolve again
web ≠ worker IPproxy routeruntime-by-runtime check

実運用の例

「LaravelでサーバーIP確認とダウンロード分流を行う方法」の現実的な利用例:ソフトウェア配布元が利便性のため近い公開ミラーを選び、最終的な署名付きダウンロード URL は Laravel サーバー側で生成します。

本番公開時の注意

LaravelでサーバーIP確認とダウンロード分流を行う方法: 既定の HTML を完全な状態で残してください。IP 位置情報は本人確認ではなく、クライアント側の結果を権限制御に使ってはいけません。

まとめ

「LaravelでサーバーIP確認とダウンロード分流を行う方法」は、共通テンプレートではなく、独自の実装手順、テスト、フォールバック動作を持つ記事になりました。