Comprobar IP del servidor y enrutar descargas en Laravel

Autor:Lisa Farrell · 2026-06-01

Laravel puede usar la misma interfaz IP de dos formas prácticas: el backend comprueba la IP de salida del servidor y la página de descarga llama la interfaz en el navegador para enrutar visitantes.

Explicación de la API

Este artículo explica tanto la comprobación de IP del servidor como el enrutamiento de descargas por IP del visitante. Son casos distintos y no deben confundirse.

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

Casos de uso

Estos casos muestran el valor de la interfaz de información IP y separan claramente IP del servidor e IP del visitante.

  • Estos casos muestran el valor de la interfaz de información IP y separan claramente IP del servidor e IP del visitante.
  • Comprobar IP del servidor y enrutar descargas en Laravel
  • Explicación de la API
  • Recomendaciones SEO y UX

Lógica de implementación

Antes de implementar, identifique el solicitante: las solicitudes del servidor devuelven IP del servidor y las del navegador devuelven IP del visitante.

  • Antes de implementar, identifique el solicitante: las solicitudes del servidor devuelven IP del servidor y las del navegador devuelven IP del visitante.
  • Este artículo explica tanto la comprobación de IP del servidor como el enrutamiento de descargas por IP del visitante. Son casos distintos y no deben confundirse.
  • Todos los ejemplos siguientes usan directamente https://my.ipin.io/info, con comentarios y textos de interfaz localizados.
  • El contenido predeterminado debe seguir completo y legible, mientras el contenido regional actúa como mejora. Los buscadores rastrean contenido estable y la página sigue siendo útil si falla la API.

Ejemplo de código

Todos los ejemplos siguientes usan directamente https://my.ipin.io/info, con comentarios y textos de interfaz localizados.

IpController

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Http;

class IpController extends Controller
{
    public function server()
    {
        $info = ['ip'=>'Desconocido', 'country'=>'Desconocido', 'region'=>'Desconocido', 'city'=>'Desconocido'];
        try {
            // Llamada del servidor a /info: comprueba la IP de salida del servidor.
            $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 de salida del servidor</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 = "Bienvenido. Este es el contenido predeterminado.";
const contentMap = { TW: "Contenido para visitantes de Taiwán", US: "Contenido para visitantes de Estados Unidos", JP: "Contenido para visitantes de Japón" };
try {
  // Llamada del navegador a /info: detecta la IP del visitante.
  const info = await fetch("https://my.ipin.io/info").then(res => res.json());
  el.textContent = contentMap[info.country] || defaultText;
} catch (e) {
  // Mantener el valor predeterminado si falla la solicitud 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']);

Recomendaciones SEO y UX

El contenido predeterminado debe seguir completo y legible, mientras el contenido regional actúa como mejora. Los buscadores rastrean contenido estable y la página sigue siendo útil si falla la API.

Errores comunes

Los siguientes puntos afectan la precisión del artículo, la utilidad del código y la credibilidad de la explicación de la API.

  • Los siguientes puntos afectan la precisión del artículo, la utilidad del código y la credibilidad de la explicación de la API.
  • El contenido predeterminado debe seguir completo y legible, mientras el contenido regional actúa como mejora. Los buscadores rastrean contenido estable y la página sigue siendo útil si falla la API.
  • Antes de implementar, identifique el solicitante: las solicitudes del servidor devuelven IP del servidor y las del navegador devuelven IP del visitante.
  • Estos casos muestran el valor de la interfaz de información IP y separan claramente IP del servidor e IP del visitante.

Resumen

Este artículo explica tanto la comprobación de IP del servidor como el enrutamiento de descargas por IP del visitante. Son casos distintos y no deben confundirse.

Preguntas frecuentes

Las preguntas siguientes fueron redactadas específicamente para este artículo y se relacionan directamente con la implementación.

Pregunta:¿Por qué importa el lado que hace la solicitud?
Respuesta:Porque una llamada del servidor representa al servidor y una llamada del navegador representa al visitante.
Pregunta:¿Por qué conservar contenido predeterminado?
Respuesta:Protege SEO, primer render y los casos en que la API no responde.
Pregunta:¿Puedo agregar más países?
Respuesta:Sí, agregando códigos de país en la tabla de mapeo.
Pregunta:¿La lógica modifica el backend?
Respuesta:No, salvo que agregue lógica del servidor por separado.
Pregunta:¿Qué pasa si falla la API?
Respuesta:La página debe conservar el contenido, enlace o mensaje predeterminado.