php laravel laravel-5 laravel-5.1 laravel-5.7

php - ¿Cómo obtener la dirección IP del cliente en Laravel 5+?



laravel-5 laravel-5.1 (12)

Si llama a esta función, obtiene fácilmente la dirección IP del cliente. Ya he usado este útil código en mi proyecto 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; }

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 usando $_SERVER["REMOTE_ADDR"] .

Está funcionando bien en el núcleo de PHP, pero cuando uso lo mismo en Laravel, proporciona la IP del servidor en lugar de la IP del visitante.


Si está bajo un equilibrador de carga

Laravel''s /Request::ip() siempre devuelve la 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 real del cliente:

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 del acelerador de Laravel

Además de esto, le sugiero que tenga mucho cuidado al usar el middleware del acelerador de Laravel: también utiliza la Request::ip() de Laravel Request::ip() , por lo que todos sus visitantes serán identificados como el mismo usuario y alcanzará el límite del acelerador muy rápidamente. . Experimentado en vivo ... esto me llevó a grandes problemas ...

Para arreglar esto:

Iluminar / Http / Request.php

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

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


Agregar espacio de nombres

use Request;

Luego llama a la función

Request::ip();


Cuando queremos la ip_address del usuario:

$_SERVER[''REMOTE_ADDR'']

y quiere la dirección del servidor:

$_SERVER[''SERVER_ADDR'']


En Laravel 5

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


Hay 2 cosas que cuidar

1) obtenga la función auxiliar que devuelve un método Illuminate/Http/Request y llame al método ->ip() .

request()->ip();

2) Piense en la configuración de su servidor, puede usar proxy o load balancer (especialmente en la configuración de AWS ELB )

Si este es su caso, necesita laravel.com/docs/master/requests#configuring-trusted-proxies o incluso configurar una opción Trusting All Proxies .

¿Por qué?

Porque ser su servidor obtendrá su IP proxy / cargador de saldo en su lugar.

¿Cómo?

Si no es AWS balance-loader

Vaya a App/Http/Middleware/TrustProxies

y hacer que la declaración de $proxies vea así:

protected $proxies = ''*'';

Ahora pruébelo y celebre, porque acaba de salvarse de tener problemas con throttle middleware . También se basa en request()->ip() y sin configurar TrustProxies , puede bloquear el inicio de sesión de todos sus usuarios en lugar de bloquear solo la IP del culpable.

Y debido a que throttle middleware no se explica correctamente en la documentación, recomiendo ver este video

Probado en Laravel 5.7


Mirando la API de Laravel :

Request::ip();

Internamente, utiliza el método getClientIps del objeto de solicitud de 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); }


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

$request->ip();


Si desea la IP del 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();


Si todavía obtiene 127.0.0.1 como IP, debe agregar su "proxy".

¡Pero cuidado con que tienes que cambiarlo antes de comenzar la producción!

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

Y ahora solo agrega esto:

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

Ahora request () -> ip () le da la ip correcta


Utilice request()->ip()

Desde Laravel 5 es (por lo que entiendo) aconseja / buena práctica utilizar las funciones globales como:

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

Entiende :-) Y, en todo caso, cuando uso las funciones (en lugar de la notaría estática) mi IDE no se enciende como un árbol de navidad ;-)


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

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