Wenn Sie sich unter einem Load Balancer befinden, gibt Laravel's \Request::ip()
immer die IP des Balancers zurück:
echo $request->ip();
// server ip
echo \Request::ip();
// server ip
echo \request()->ip();
// server ip
echo $this->getIp(); //see the method below
// clent ip
Diese benutzerdefinierte Methode gibt die tatsächliche Client-IP zurück:
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;
}
}
}
}
}
Darüber hinaus empfehle ich Ihnen, mit der Gas- Middleware von Laravel sehr vorsichtig umzugehen : Sie verwendet auch die von Laravel Request::ip()
, sodass alle Ihre Besucher als derselbe Benutzer identifiziert werden und Sie das Gaslimit sehr schnell erreichen. Ich habe das live erlebt und das hat große Probleme verursacht.
Um dies zu beheben:
Illuminate \ Http \ Request.php
public function ip()
{
//return $this->getClientIp(); //original method
return $this->getIp(); // the above method
}
Sie können jetzt auch verwenden Request::ip()
, was die reale IP in der Produktion zurückgeben soll.