Verificar IP do servidor e rotear downloads no Laravel

Autor:Lisa Farrell · 2026-06-01

Laravel pode usar a mesma interface IP de duas formas: o backend verifica o IP de saída do servidor, enquanto a página de download chama a interface no navegador para rotear visitantes.

Explicação da API

O artigo explica tanto a verificação de IP do servidor quanto o roteamento de downloads pelo IP do visitante. São usos diferentes e não devem ser confundidos.

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

Cenários de aplicação

Esses cenários mostram o valor da interface de informações IP e separam claramente IP do servidor e IP do visitante.

  • Esses cenários mostram o valor da interface de informações IP e separam claramente IP do servidor e IP do visitante.
  • Verificar IP do servidor e rotear downloads no Laravel
  • Explicação da API
  • Recomendações de SEO e UX

Lógica de implementação

Antes de implementar, identifique quem faz a requisição: requisições do servidor retornam IP do servidor, requisições do navegador retornam IP do visitante.

  • Antes de implementar, identifique quem faz a requisição: requisições do servidor retornam IP do servidor, requisições do navegador retornam IP do visitante.
  • O artigo explica tanto a verificação de IP do servidor quanto o roteamento de downloads pelo IP do visitante. São usos diferentes e não devem ser confundidos.
  • Todos os exemplos abaixo usam diretamente https://my.ipin.io/info, com comentários e textos de interface localizados.
  • O conteúdo padrão deve permanecer completo e legível, enquanto o conteúdo regional atua como melhoria. Buscadores rastreiam conteúdo estável e a página continua utilizável se a API falhar.

Exemplo de código

Todos os exemplos abaixo usam diretamente https://my.ipin.io/info, com comentários e textos de interface localizados.

IpController

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Http;

class IpController extends Controller
{
    public function server()
    {
        $info = ['ip'=>'Desconhecido', 'country'=>'Desconhecido', 'region'=>'Desconhecido', 'city'=>'Desconhecido'];
        try {
            // Chamada server-side para /info: verifica o IP de saída do 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 saída do 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 = "Bem-vindo. Este é o conteúdo padrão.";
const contentMap = { TW: "Conteúdo para visitantes de Taiwan", US: "Conteúdo para visitantes dos Estados Unidos", JP: "Conteúdo para visitantes do Japão" };
try {
  // Chamada no navegador para /info: detecta o IP do visitante.
  const info = await fetch("https://my.ipin.io/info").then(res => res.json());
  el.textContent = contentMap[info.country] || defaultText;
} catch (e) {
  // Manter o valor padrão se a requisição da API falhar.
  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']);

Recomendações de SEO e UX

O conteúdo padrão deve permanecer completo e legível, enquanto o conteúdo regional atua como melhoria. Buscadores rastreiam conteúdo estável e a página continua utilizável se a API falhar.

Erros comuns

Os pontos abaixo afetam a precisão do artigo, a usabilidade do código e a credibilidade da explicação da API.

  • Os pontos abaixo afetam a precisão do artigo, a usabilidade do código e a credibilidade da explicação da API.
  • O conteúdo padrão deve permanecer completo e legível, enquanto o conteúdo regional atua como melhoria. Buscadores rastreiam conteúdo estável e a página continua utilizável se a API falhar.
  • Antes de implementar, identifique quem faz a requisição: requisições do servidor retornam IP do servidor, requisições do navegador retornam IP do visitante.
  • Esses cenários mostram o valor da interface de informações IP e separam claramente IP do servidor e IP do visitante.

Resumo

O artigo explica tanto a verificação de IP do servidor quanto o roteamento de downloads pelo IP do visitante. São usos diferentes e não devem ser confundidos.

Perguntas frequentes

As perguntas abaixo foram escritas especificamente para este artigo e estão diretamente ligadas à implementação.

Pergunta:Por que distinguir o lado da requisição?
Resposta:Porque chamada do servidor representa o servidor, e chamada do navegador representa o visitante.
Pergunta:Por que manter conteúdo padrão?
Resposta:Ele protege SEO, primeira renderização e casos em que a API não responde.
Pergunta:Posso adicionar mais países?
Resposta:Sim, adicionando códigos de país à tabela de mapeamento.
Pergunta:A lógica altera o backend?
Resposta:Não, a menos que você adicione lógica server-side separada.
Pergunta:O que fazer se a API falhar?
Resposta:A página deve manter conteúdo, link ou mensagem padrão.