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が失敗したらどうなりますか?
回答:デフォルト内容、リンク、メッセージを維持します。