Pregunta ¿Cómo obtener la dirección IP del cliente en Laravel 5.1?


Estoy tratando de obtener la dirección IP del cliente en Laravel. Como todos sabemos, es mucho más fácil obtener la IP de un cliente en PHP utilizando $_SERVER["REMOTE_ADDR"].

Funciona bien en Core PHP, pero cuando uso lo mismo en Laravel, da IP de servidor en lugar de IP de visitante.


75
2017-10-21 20:32


origen


Respuestas:


Mirando a la Laravel API:

Request::ip();

Internamente, usa el getClientIps método de la Objeto de solicitud Symfony:

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);
}

104
2017-10-21 20:35



Utilizar request()->ip() :)

Desde Laravel 5 es (según tengo entendido) una buena práctica recomendada para usar las funciones globales como:

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

Obtienes el punto :-) Y, en todo caso, al utilizar las funciones (en lugar del notariado estático) mi IDE no se enciende como un árbol de navidad ;-)


41
2017-12-10 15:00



Si está bajo un equilibrador de carga

Laravel \Request::ip()  siempre devolver el IP del equilibrador

            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 devuelve la IP del 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;
                }
            }
        }
    }
}

Más: si usa el middleware acelerador de Laravel

Además de esto, le sugiero que tenga mucho cuidado con la Laravel acelerador middleware: Utiliza el Laravel Request::ip() así, todos sus visitantes serán identificados como el mismo usuario y usted alcanzará el límite de aceleración muy rápidamente. Experimentado en vivo ... esto me llevó a grandes problemas ...

Para arreglar esto:

Illuminate \ Http \ Request.php

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

Ahora también puedes usar Request::ip(), que debería devolver la IP real en producción


34
2018-01-20 17:44



Agregar espacio de nombres

use Request;

Luego llama a la función

Request::ip();

18
2018-01-19 09:42



Para Laravel 5 puede usar el objeto Request. Simplemente llame a su método ip (). Algo como:

$request->ip();


11
2018-03-07 14:32



En Laravel 5

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

9
2018-06-21 07:16



en la versión laravel 5.4 no podemos llamar a IP static esta es una forma correcta de obtener un usuario de ip

 use Illuminate\Http\Request;

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

2
2018-06-30 09:12



Si desea IP de cliente y su servidor está detrás de aws elb, utilice el siguiente código. Probado para laravel 5.3

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

2
2017-10-24 03:18



En la nueva versión, puedes obtenerlo con solicitud de ayuda

request()->ip();

0
2018-05-28 04:51