Frage Wie bekomme ich die Client-IP-Adresse in Laravel 5.1?


Ich versuche, die IP-Adresse des Kunden in Laravel zu erhalten. Wie wir alle wissen, ist es viel einfacher, die IP eines Clients in PHP zu erhalten $_SERVER["REMOTE_ADDR"].

Es funktioniert gut in PHP-Kern, aber wenn ich dasselbe in Laravel verwende, dann gibt es Server-IP statt Besucher-IP.


75
2017-10-21 20:32


Ursprung


Antworten:


Mit Blick auf die Laravel API:

Request::ip();

Intern benutzt es die getClientIps Methode von der Symfony-Anfrageobjekt:

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

104
2017-10-21 20:35



Benutzen request()->ip() :)

Seit Laravel 5 ist es (von dem, was ich verstehe) empfohlen / gute Praxis, die globalen Funktionen wie zu verwenden:

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

Du bekommst den Punkt :-) Und wenn ich die Funktionen benutze (statt der statischen Notarion), leuchtet meine IDE nicht wie ein Weihnachtsbaum ;-)


41
2017-12-10 15:00



Wenn Sie sich in einem Lastenausgleich befinden

Laravels \Request::ip()  immer Gib 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 echte 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;
                }
            }
        }
    }
}

Mehr: Wenn Sie die Laravel-Middleware verwenden

Darüber hinaus schlage ich vor, dass Sie sehr vorsichtig mit Laravels sind drosseln Middleware: Es verwendet die Laravel's Request::ip() Außerdem werden alle Ihre Besucher als derselbe Benutzer identifiziert und Sie werden sehr schnell auf das Limit stoßen. Erfahren im Leben ... das hat mich zu großen Problemen geführt ...

Um das zu beheben:

Beleuchten \ 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(), die die echte IP in der Produktion zurückgeben sollte


34
2018-01-20 17:44



Namespace hinzufügen

use Request;

Dann rufe die Funktion an

Request::ip();

18
2018-01-19 09:42



Für Laravel 5 können Sie das Request-Objekt verwenden. Rufen Sie einfach seine ip () -Methode auf. Etwas wie:

$request->ip();


11
2018-03-07 14:32



In Laravel 5

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

9
2018-06-21 07:16



in Version Laravel 5.4 können wir nicht ip statische dies eine korrekte Möglichkeit, IP-Benutzer zu erhalten

 use Illuminate\Http\Request;

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

2
2018-06-30 09:12



Wenn Sie die Client-IP-Adresse wünschen und Ihr Server hinter aws elb steht, verwenden Sie den folgenden Code. Getestet für Laravel 5.3

$elbSubnet = '172.31.0.0/16';
Request::setTrustedProxies([$elbSubnet]);
$clientIp = $request->ip();

2
2017-10-24 03:18