Pertanyaan Bagaimana cara mendapatkan alamat IP klien di Laravel 5.1?


Saya mencoba mendapatkan alamat IP klien di Laravel. Seperti kita semua tahu bahwa itu jauh lebih mudah untuk mendapatkan IP klien dalam PHP dengan menggunakan $_SERVER["REMOTE_ADDR"].

Ini berfungsi dengan baik di PHP inti, tetapi ketika saya menggunakan hal yang sama di Laravel, maka ia memberikan IP server bukan IP pengunjung.


75
2017-10-21 20:32


asal


Jawaban:


Melihat ke API Laravel:

Request::ip();

Secara internal, ia menggunakan getClientIps metode dari Symfony Request Object:

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



Menggunakan request()->ip() :)

Sejak Laravel 5 itu (dari yang saya mengerti) disarankan / praktik yang baik untuk menggunakan fungsi global seperti:

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

Anda mendapatkan intinya :-) Dan jika ada, ketika menggunakan fungsi (bukan notarion statis) IDE saya tidak ligt seperti pohon natal ;-)


41
2017-12-10 15:00



Jika Anda berada di bawah penyeimbang beban

Laravel \Request::ip()  selalu kembalikan IP penyeimbang

            echo $request->ip();
            // server ip

            echo \Request::ip();
            // server ip

            echo \request()->ip();
            // server ip

            echo $this->getIp(); //see the method below
            // clent ip

Metode khusus ini mengembalikan ip klien nyata:

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

Lainnya: Jika Anda menggunakan middleware throttle Laravel

Selain ini saya menyarankan Anda untuk berhati-hati menggunakan LARAVEL mencekik middleware: Menggunakan LARAVEL Request::ip() juga, jadi semua pengunjung Anda akan diidentifikasi sebagai pengguna yang sama dan Anda akan mencapai batas kecepatan gas sangat cepat. Berpengalaman dalam hidup ... ini membawa saya ke masalah besar ...

Untuk memperbaiki ini:

Menerangi \ Http \ Request.php

    public function ip()
    {
        //return $this->getClientIp(); //original method
        return $this->getIp(); // the above method
    }

Anda sekarang dapat juga menggunakan Request::ip(), yang seharusnya mengembalikan IP asli dalam produksi


34
2018-01-20 17:44



Tambahkan ruang nama

use Request;

Kemudian panggil fungsinya

Request::ip();

18
2018-01-19 09:42



Untuk Laravel 5 Anda dapat menggunakan objek Permintaan. Cukup panggil metode ip () nya. Sesuatu seperti:

$request->ip();


11
2018-03-07 14:32



Di Laravel 5

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

9
2018-06-21 07:16



dalam versi laravel 5.4 kita tidak bisa memanggil ip statis ini cara yang benar untuk mendapatkan pengguna ip

 use Illuminate\Http\Request;

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

2
2018-06-30 09:12