Laravel может использовать один IP-интерфейс двумя способами: backend проверяет исходящий IP сервера, а страница загрузки вызывает интерфейс в браузере для маршрутизации посетителей.
Описание API
В статье объясняются два сценария: проверка IP сервера и маршрутизация загрузок по IP посетителя. Это разные задачи, их нельзя смешивать.
{"ip":"185.220.236.7","country":"TW","region":"Taiwan","city":"Taipei"}
Сценарии применения
Эти сценарии показывают ценность IP-интерфейса и четко разделяют IP сервера и IP посетителя.
- Эти сценарии показывают ценность IP-интерфейса и четко разделяют IP сервера и IP посетителя.
- Проверка IP сервера и маршрутизация загрузок в Laravel
- Описание 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 посетителя. Это разные задачи, их нельзя смешивать.
Частые вопросы
Вопросы ниже подготовлены специально для этой статьи и напрямую связаны с реализацией.