Mirando la API de Laravel :
Request::ip();
Internamente, utiliza el getClientIps
método 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);
}
Si está bajo un equilibrador de carga, Laravel
\Request::ip()
siempre devuelve la IP del equilibrador:Este método personalizado devuelve la IP real del cliente:
Además de esto, le sugiero que tenga mucho cuidado al usar el middleware del acelerador de Laravel : también usa el 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. Experimenté esto en vivo y esto causó grandes problemas.Para arreglar esto:
Iluminar \ Http \ Request.php
Ahora también puede usar
Request::ip()
, que debería devolver la IP real en producción.fuente
Uso
request()->ip()
.Por lo que entiendo, desde Laravel 5 se recomienda / una buena práctica utilizar las funciones globales como:
Y, en todo caso, cuando uso las funciones en lugar de la notación estática, mi IDE no se ilumina como un árbol de Navidad.
fuente
request
es una función "global": es una de las funciones de ayuda global proporcionadas por laravel. Sin embargo, la fachada Solicitud, no es estática (ni el método ip)request()->foo
,Reqest::foo
y$request->foo
son idénticos. Eche un vistazo a esta esencia para ver un ejemplo: gist.github.com/cjke/026e3036c6a10c672dc5Request::ip
puede ser engañoso"request()->ip()
es correcta, el texto que lo rodea es muy engañoso - en especial para decir "no lo esRequest::ip
.Agregar espacio de nombres
Luego llama a la función
fuente
use Request
porque está intentando usar la Fachada. El espacio de nombres que proporcionó es para la clase subyacente. Si importa que obtendrá un error porqueip()
no se puede llamar estáticamente, para eso está la fachada.use Illuminate\Support\Facades\Request
. Si no, solo úsalo\Request::
.Para Laravel 5 puede usar el objeto Solicitar. Simplemente llame a su
ip()
método, algo así como:fuente
En Laravel 5
fuente
Hay dos cosas que cuidar:
Obtenga una función auxiliar que devuelva ay
Illuminate\Http\Request
llame al->ip()
método:Piense en la configuración de su servidor, puede usar un proxy o
load-balancer
, especialmente en una configuración de AWS ELB.Si este es su caso, debe seguir " Configuración de servidores proxy de confianza " o incluso configurar una opción de "Confiar en todos los servidores proxy".
¿Por qué? Porque ser su servidor obtendrá su proxy /
load-balancer
IP en su lugar.Si está en el cargador de equilibrio de AWS, vaya
App\Http\Middleware\TrustProxies
y haga que la$proxies
declaración se vea así:Ahora pruébelo y celebre porque acaba de salvarse de tener problemas con el middleware del acelerador. 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 el middleware del acelerador no se explica correctamente en la documentación, recomiendo ver el " tutorial de laravel 5.2 para principiantes, API Rate Limiting "
Probado en Laravel 5.7
fuente
En Laravel 5.4 no podemos llamar a ip static. Esta es una forma correcta de obtener la IP del usuario:
fuente
Si llama a esta función, obtiene fácilmente la dirección IP del cliente. Ya he usado esto en mi proyecto existente:
fuente
Si todavía obtiene 127.0.0.1 como IP, debe agregar su "proxy", ¡pero tenga en cuenta que debe cambiarlo antes de entrar en producción!
Lea " Configuración de servidores proxy de confianza ".
Y agrega esto:
Ahora
request()->ip()
te da la IP correcta.fuente
Si desea la IP del cliente y su servidor está detrás de aws elb, use el siguiente código. Probado para laravel 5.3
fuente
Si tiene proxies de varias capas como CDN + Load Balancer.
El uso de la función Laravel Request :: ip () obtendrá la IP proxy más a la derecha pero no la IP del cliente.
Puede intentar la siguiente solución.
app / Http / Middleware / TrustProxies.php
Referencia: https://github.com/fideloper/TrustedProxy/issues/107#issuecomment-373065215
fuente
Usé la función getIp de Sebastien Horin y request () -> ip () (a solicitud global), porque para localhost la función getIp devuelve nulo:
$this->getIp() ?? request()->ip();
La función getIp:
}
fuente
Cuando queremos el usuario
ip_address
:y quiere la dirección del servidor:
fuente
fuente