En regardant l' API Laravel :
Request::ip();
En interne, il utilise la getClientIps
méthode de l' objet de requête 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 vous êtes sous un équilibreur de charge, Laravel renvoie
\Request::ip()
toujours l'adresse IP de l'équilibreur:Cette méthode personnalisée renvoie l'IP du client réel:
En plus de cela, je vous suggère d'être très prudent en utilisant le middleware d' accélération de Laravel : il utilise
Request::ip()
, donc tous vos visiteurs seront identifiés comme le même utilisateur et vous atteindrez la limite des gaz très rapidement. J'ai vécu cela en direct et cela a causé de gros problèmes.Pour résoudre ce problème:
Illuminate \ Http \ Request.php
Vous pouvez maintenant également utiliser
Request::ip()
, qui devrait renvoyer la véritable adresse IP en production.la source
Utilisation
request()->ip()
.D'après ce que je comprends, depuis Laravel 5, il est conseillé / bonne pratique d'utiliser les fonctions globales telles que:
Et, si quoi que ce soit, lorsque vous utilisez les fonctions au lieu de la notation statique, mon IDE ne s'allume pas comme un arbre de Noël.
la source
request
une fonction "globale" - c'est l'une des fonctions d'assistance globales fournies par laravel. Cependant, la façade de demande, n'est pas statique (ni l'adresse IP de la méthode) -request()->foo
, etReqest::foo
et$request->foo
sont tous identiques. Jetez un œil à cet essentiel pour un exemple: gist.github.com/cjke/026e3036c6a10c672dc5Request::ip
peut-être pas trompeurrequest()->ip()
correct, le texte qui l'entoure est vraiment trompeur - surtout pour dire "ce n'est pas le casRequest::ip
.Ajouter un espace de noms
Puis appelez la fonction
la source
use Request
parce que vous essayez d'utiliser la façade. L'espace de noms que vous avez fourni est pour la classe sous-jacente. Si vous importez cela, vous obtiendrez une erreur carip()
il ne peut pas être appelé statiquement, c'est à cela que sert la façade.use Illuminate\Support\Facades\Request
. Sinon, utilisez simplement\Request::
.Pour Laravel 5, vous pouvez utiliser l'objet Request. Appelez simplement sa
ip()
méthode, quelque chose comme:la source
Dans Laravel 5
la source
Il y a deux choses à prendre en compte:
Obtenez une fonction d'assistance qui renvoie a
Illuminate\Http\Request
et appelez la->ip()
méthode:Pensez à la configuration de votre serveur, il peut utiliser un proxy ou
load-balancer
, en particulier dans une configuration AWS ELB.Si c'est votre cas, vous devez suivre « Configurer les proxies de confiance » ou peut-être même définir une option «Faire confiance à tous les proxies».
Pourquoi? Parce qu'être votre serveur obtiendra votre proxy /
load-balancer
IP à la place.Si vous êtes sur le chargeur d'équilibrage AWS, accédez à
App\Http\Middleware\TrustProxies
et faites en sorte que la$proxies
déclaration ressemble à ceci:Maintenant, testez-le et célébrez-le parce que vous venez de vous éviter des problèmes avec le middleware d'accélérateur. Il repose également sur
request()->ip()
et sans paramétrer "TrustProxies", vous pourriez empêcher tous vos utilisateurs de se connecter au lieu de bloquer uniquement l'adresse IP du coupable.Et comme le middleware de throttle n'est pas expliqué correctement dans la documentation, je recommande de regarder le " tutoriel laravel 5.2 pour débutant, API Rate Limiting "
Testé dans Laravel 5.7
la source
Dans Laravel 5.4, nous ne pouvons pas appeler ip static. C'est une manière correcte d'obtenir l'adresse IP de l'utilisateur:
la source
Si vous appelez cette fonction, vous obtenez facilement l'adresse IP du client. J'ai déjà utilisé ceci dans mon projet existant:
la source
Si vous obtenez toujours 127.0.0.1 comme IP, vous devez ajouter votre "proxy", mais sachez que vous devez le changer avant de passer en production!
Lisez « Configuration des proxys approuvés ».
Et ajoutez ceci:
request()->ip()
Vous donne maintenant la bonne adresse IP.la source
Si vous voulez une adresse IP client et que votre serveur est derrière aws elb, utilisez le code suivant. Testé pour laravel 5.3
la source
Si vous avez plusieurs proxys de couche comme CDN + Load Balancer.
L'utilisation de la fonction Laravel Request :: ip () obtiendra l'IP proxy le plus à droite mais pas l'IP client.
Vous pouvez essayer la solution suivante.
app / Http / Middleware / TrustProxies.php
Référence: https://github.com/fideloper/TrustedProxy/issues/107#issuecomment-373065215
la source
J'ai utilisé la fonction Sebastien Horin getIp et request () -> ip () (à la demande globale), car pour localhost la fonction getIp renvoie null:
$this->getIp() ?? request()->ip();
La fonction getIp:
}
la source
Lorsque nous voulons que l'utilisateur
ip_address
:et souhaitez l'adresse du serveur:
la source
la source