it-swarm-pt.tech

Como obter o endereço IP do cliente em Laravel 5+

Estou tentando obter o endereço IP do cliente no Laravel. Como todos sabemos, é muito mais fácil obter o IP de um cliente em PHP usando $_SERVER["REMOTE_ADDR"].

Ele está funcionando bem no PHP principal, mas quando eu uso a mesma coisa no Laravel, ele dá o IP do servidor ao invés do IP do visitante.

91
Amrinder Singh

Olhando para a API Laravel :

Request::ip();

Internamente, ele usa o método getClientIps 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);
} 
125
samlev

Use request()->ip() 

Desde Laravel 5 é (pelo que entendi) aconselhado/boa prática usar as funções globais como: 

response()->json($v);
view('path.to.blade');
redirect();
route();
cookie();

Você começa o ponto :-) E se qualquer coisa, ao usar as funções (em vez do notarion estático) meu IDE não liga como uma árvore de natal ;-)

51
Stan Smulders

Se você estiver sob um balanceador de carga

A \Request::ip() do Laravel sempre retorna o IP do balanceador

            echo $request->ip();
            // server ip

            echo \Request::ip();
            // server ip

            echo \request()->ip();
            // server ip

            echo $this->getIp(); //see the method below
            // clent ip

Este método personalizado retorna o ip do cliente real:

public function getIp(){
    foreach (array('HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR') as $key){
        if (array_key_exists($key, $_SERVER) === true){
            foreach (explode(',', $_SERVER[$key]) as $ip){
                $ip = trim($ip); // just to be safe
                if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) !== false){
                    return $ip;
                }
            }
        }
    }
}

Mais: Se você usar o middleware de aceleração do Laravel

Além disso, sugiro que você seja muito cuidadoso ao usar o Laravel's throttle middleware: Ele também usa o Request::ip() do Laravel, então todos os visitantes serão identificados como o mesmo usuário e você atingirá o limite de aceleração muito rapidamente. Experiente em viver ... isso me levou a grandes questões ...

Para corrigir isso:

Illuminate\Http\Request.php

    public function ip()
    {
        //return $this->getClientIp(); //original method
        return $this->getIp(); // the above method
    }

Agora você também pode usar Request::ip(), que deve retornar o IP real em produção

46
Sebastien Horin

Adicionar namespace 

use Request;

Então chame a função 

Request::ip();
22
shalini

Para Laravel 5 você pode usar o objeto Request. Apenas chame seu método ip (). Algo como:

$request->ip();

12
TodStoychev

Em Laravel 5

public function index(Request $request) {
  $request->ip();
}
9
Govind Samrow

na versão laravel 5,4 não podemos chamar ip estática esta uma maneira correta de obter o usuário ip 

 use Illuminate\Http\Request;

public function contactUS(Request $request)
    {
        echo $request->ip();
        return view('page.contactUS');
    }
2
Vahid Alvandi

Se você quer o IP do cliente e seu servidor está por trás do awb elb, então use o seguinte código. Testado para o laravel 5.3

$elbSubnet = '172.31.0.0/16';
Request::setTrustedProxies([$elbSubnet]);
$clientIp = $request->ip();
2
Aung Bo

Existem duas coisas para cuidar

1) obtém a função auxiliar que retorna um método Illuminate\Http\Request e chama ->ip().

request()->ip();

2) Pense na configuração do seu servidor, ele pode usar proxy ou load balancer (especialmente em AWS ELB config)

Se este for o seu caso, você precisa Configurar Proxies Confiáveis ​​ ou talvez até definir uma opção Trusting All Proxies.

Por quê?

Porque sendo seu servidor estará recebendo seu proxy/IP do carregador de equilíbrio em seu lugar.

Como?

Se você não é AWS balance-loader

Vá para App\Http\Middleware\TrustProxies

e faça a declaração $proxies ficar assim:

protected $proxies = '*';

Agora teste e celebre, porque você acabou de se salvar de ter problemas com throttle middleware. Ele também depende de request()->ip() e sem configurar TrustProxies up, você pode bloquear todos os seus usuários de efetuar login em vez de bloquear apenas o IP do culpado.

E como throttle middleware não é explicado corretamente na documentação, recomendo assistir este vídeo

Testado em Laravel 5.7

1
Yevgeniy Afanasyev

Se você ainda está recebendo 127.0.0.1 como IP, você precisa adicionar seu "proxy". 

Mas cuidado que você tem que mudá-lo antes de ir para a produção!

Leia esta parte: https://laravel.com/docs/5.7/requests#configuring-trusted-proxies

E agora apenas adicione isto:

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array
     */
    protected $proxies = '*';

Agora request () -> ip () te dá o ip correto

1
Shadrix

Se você chamar essa função, você obterá facilmente o endereço IP do cliente. Eu já usei este código útil em meu projeto existente.

public function getUserIpAddr(){
       $ipaddress = '';
       if (isset($_SERVER['HTTP_CLIENT_IP']))
           $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
       else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
           $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
       else if(isset($_SERVER['HTTP_X_FORWARDED']))
           $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
       else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
           $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
       else if(isset($_SERVER['HTTP_FORWARDED']))
           $ipaddress = $_SERVER['HTTP_FORWARDED'];
       else if(isset($_SERVER['REMOTE_ADDR']))
           $ipaddress = $_SERVER['REMOTE_ADDR'];
       else
           $ipaddress = 'UNKNOWN';    
       return $ipaddress;
    }
0
Soura Sankar Ghosh