Olhando para a API do Laravel :
Request::ip();
Internamente, ele usa o getClientIps
método do Symfony Request Object :
public function getClientIps()
{
$clientIps = array();
$ip = $this->server->get('REMOTE_ADDR');
if (!$this->isFromTrustedProxy()) {
return array($ip);
}
if (self::$trustedHeaders[self::HEADER_FORWARDED] && $this->headers->has(self::$trustedHeaders[self::HEADER_FORWARDED])) {
$forwardedHeader = $this->headers->get(self::$trustedHeaders[self::HEADER_FORWARDED]);
preg_match_all('{(for)=("?\[?)([a-z0-9\.:_\-/]*)}', $forwardedHeader, $matches);
$clientIps = $matches[3];
} elseif (self::$trustedHeaders[self::HEADER_CLIENT_IP] && $this->headers->has(self::$trustedHeaders[self::HEADER_CLIENT_IP])) {
$clientIps = array_map('trim', explode(',', $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_IP])));
}
$clientIps[] = $ip; // Complete the IP chain with the IP the request actually came from
$ip = $clientIps[0]; // Fallback to this when the client IP falls into the range of trusted proxies
foreach ($clientIps as $key => $clientIp) {
// Remove port (unfortunately, it does happen)
if (preg_match('{((?:\d+\.){3}\d+)\:\d+}', $clientIp, $match)) {
$clientIps[$key] = $clientIp = $match[1];
}
if (IpUtils::checkIp($clientIp, self::$trustedProxies)) {
unset($clientIps[$key]);
}
}
// Now the IP chain contains only untrusted proxies and the client IP
return $clientIps ? array_reverse($clientIps) : array($ip);
}
Se você estiver com um balanceador de carga, o Laravel
\Request::ip()
sempre retornará o IP do balanceador:Este método personalizado retorna o ip do cliente real:
Além disso, sugiro que você tenha muito cuidado com o middleware do acelerador do Laravel : ele usa o
Request::ip()
, para que todos os seus visitantes sejam identificados como o mesmo usuário e você atingirá o limite do acelerador rapidamente. Eu experimentei isso ao vivo e isso causou grandes problemas.Para corrigir isso:
Iluminar \ Http \ Request.php
Agora você também pode usar
Request::ip()
, o que deve retornar o IP real na produção.fonte
Use
request()->ip()
.Pelo que entendi, desde o Laravel 5 é aconselhável / boa prática usar funções globais como:
E, se for o caso, ao usar as funções em vez da notação estática, meu IDE não acende como uma árvore de Natal.
fonte
request
é uma função "global" - é uma das funções auxiliares globais fornecidas pelo laravel. No entanto, a fachada Request, não é estática (nem é o ip método) -request()->foo
, eReqest::foo
e$request->foo
são todos idênticos. Dê uma olhada nesta lista principal para obter um exemplo: gist.github.com/cjke/026e3036c6a10c672dc5Request::ip
pode ser enganosarequest()->ip()
esteja correto, o texto circundante é realmente enganosa - especialmente a dizer "não éRequest::ip
.Adicionar espaço para nome
Então chame a função
fonte
use Request
porque está tentando usar a Fachada. O espaço para nome que você forneceu é para a classe subjacente. Se você importar que receberá um erro porqueip()
não pode ser chamado estaticamente, é para isso que serve a fachada.use Illuminate\Support\Facades\Request
. Se não, basta usar\Request::
.Para o Laravel 5, você pode usar o objeto Request. Apenas chame seu
ip()
método, algo como:fonte
No Laravel 5
fonte
Há duas coisas para cuidar:
Obtenha uma função auxiliar que retorne ae
Illuminate\Http\Request
chame o->ip()
método:Pense na configuração do servidor, ele pode usar um proxy ou
load-balancer
, especialmente em uma configuração do AWS ELB.Se esse for o seu caso, você precisa seguir " Configurando proxies confiáveis " ou talvez até definir a opção "Confiando em todos os proxies".
Por quê? Porque ser seu servidor estará obtendo seu proxy /
load-balancer
IP.Se você estiver no balance loader da AWS, acesse
App\Http\Middleware\TrustProxies
e faça a$proxies
declaração parecer com esta:Agora teste e comemore porque você acabou de se livrar de ter problemas com o middleware do acelerador. Ele também conta com
request()->ip()
e sem configurar "TrustProxies", você pode impedir que todos os usuários façam login, em vez de bloquear apenas o IP do culpado.E como o middleware do acelerador não é explicado corretamente na documentação, recomendo assistir "o tutorial do laravel 5.2 para iniciantes, limitação de taxa de API "
Testado no Laravel 5.7
fonte
No Laravel 5.4, não podemos chamar IP estático. Esta é uma maneira correta de obter o IP do usuário:
fonte
Se você chamar esta função, obterá facilmente o endereço IP do cliente. Eu já usei isso no meu projeto existente:
fonte
Se você ainda estiver obtendo 127.0.0.1 como IP, precisará adicionar seu "proxy", mas lembre-se de que precisa alterá-lo antes de entrar em produção!
Leia " Configurando proxies confiáveis ".
E adicione isso:
Agora
request()->ip()
fornece o IP correto.fonte
Se você deseja o IP do cliente e seu servidor está atrás do aws elb, use o código a seguir. Testado para laravel 5.3
fonte
Se você possui proxies de várias camadas, como o CDN + Load Balancer.
O uso da função Request :: ip () do Laravel obterá o IP do proxy mais à direita, mas não o IP do cliente.
Você pode tentar seguir a solução.
app / Http / Middleware / TrustProxies.php
Referência: https://github.com/fideloper/TrustedProxy/issues/107#issuecomment-373065215
fonte
Eu usei a função SebastIi Horin getIp e request () -> ip () (a pedido global), porque para localhost a função getIp retorna nulo:
$this->getIp() ?? request()->ip();
A função getIp:
}
fonte
Quando queremos o usuário
ip_address
:e deseja o endereço do servidor:
fonte
fonte