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