Melihat API Laravel :
Request::ip();
Secara internal, ia menggunakan getClientIps
metode dari Objek Permintaan 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);
}
Jika Anda berada di bawah penyeimbang beban, Laravel
\Request::ip()
selalu mengembalikan IP penyeimbang:Metode khusus ini mengembalikan ip klien nyata:
Selain itu, saya sarankan Anda untuk sangat berhati-hati menggunakan middleware throttle Laravel : Menggunakan Laravel's
Request::ip()
juga, sehingga semua pengunjung Anda akan diidentifikasi sebagai pengguna yang sama dan Anda akan mencapai batas throttle dengan sangat cepat. Saya mengalami ini langsung dan ini menyebabkan masalah besar.Untuk memperbaikinya:
Menerangi \ Http \ Request.php
Anda sekarang dapat juga menggunakan
Request::ip()
, yang seharusnya mengembalikan IP asli dalam produksi.sumber
Gunakan
request()->ip()
.Dari apa yang saya mengerti, karena Laravel 5 disarankan / praktik yang baik untuk menggunakan fungsi global seperti:
Dan, jika ada, ketika menggunakan fungsi bukan notasi statis IDE saya tidak menyala seperti pohon Natal.
sumber
request
adalah fungsi "global" - itu adalah salah satu fungsi pembantu global yang disediakan oleh laravel. Namun, Permintaan fasad, tidak statis (juga bukan metode ip) -request()->foo
, danReqest::foo
dan$request->foo
semua identik. Lihat intisari ini sebagai contoh: gist.github.com/cjke/026e3036c6a10c672dc5Request::ip
mungkin menyesatkanrequest()->ip()
benar, teks di sekitarnya benar-benar menyesatkan - terutama untuk mengatakan "tidakRequest::ip
.Tambahkan namespace
Kemudian panggil fungsinya
sumber
use Request
karena Anda mencoba menggunakan Fasad. Namespace yang Anda berikan adalah untuk kelas yang mendasarinya. Jika Anda mengimpor bahwa Anda akan mendapatkan kesalahan karenaip()
tidak dapat dipanggil secara statis, itulah tujuan dari fasad.use Illuminate\Support\Facades\Request
. Jika tidak, gunakan saja\Request::
.Untuk Laravel 5 Anda dapat menggunakan objek Permintaan. Sebut saja
ip()
metodenya, sesuatu seperti:sumber
Dalam Laravel 5
sumber
Ada dua hal yang harus diperhatikan:
Dapatkan fungsi pembantu yang mengembalikan a
Illuminate\Http\Request
dan memanggil->ip()
metode:Pikirkan konfigurasi server Anda, mungkin menggunakan proxy atau
load-balancer
, terutama dalam konfigurasi AWS ELB.Jika ini adalah kasus Anda, Anda harus mengikuti " Mengkonfigurasi Proxy Tepercaya " atau bahkan mungkin menyetel opsi "Percayai Semua Proxy".
Mengapa? Karena menjadi server Anda akan mendapatkan proxy /
load-balancer
IP Anda sebagai gantinya.Jika Anda berada di loader-AWS, pergi ke
App\Http\Middleware\TrustProxies
dan buat$proxies
deklarasi terlihat seperti ini:Sekarang, uji dan rayakan karena Anda baru saja menyelamatkan diri dari masalah dengan middleware throttle. Itu juga bergantung pada
request()->ip()
dan tanpa mengatur "TrustProxies", Anda bisa membuat semua pengguna Anda diblokir dari masuk bukannya hanya memblokir IP pelakunya.Dan karena throttle middleware tidak dijelaskan dengan benar dalam dokumentasi, saya sarankan menonton " tutorial laravel 5.2 untuk pemula, API Rate Limiting "
Diuji dalam Laravel 5.7
sumber
Di Laravel 5.4 kita tidak bisa memanggil ip static. Ini cara yang benar untuk mendapatkan IP pengguna:
sumber
Jika Anda memanggil fungsi ini maka Anda dengan mudah mendapatkan alamat IP klien. Saya sudah menggunakan ini dalam proyek saya yang ada:
sumber
Jika Anda masih mendapatkan 127.0.0.1 sebagai IP, Anda perlu menambahkan "proxy" Anda, tetapi perlu diketahui bahwa Anda harus mengubahnya sebelum mulai berproduksi!
Baca " Mengkonfigurasi Proxy Tepercaya ".
Dan tambahkan ini:
Sekarang
request()->ip()
memberi Anda IP yang benar.sumber
Jika Anda ingin IP klien dan server Anda berada di belakang aws elb, maka gunakan kode berikut. Diuji untuk laravel 5.3
sumber
Jika Anda memiliki beberapa proksi layer seperti CDN + Load Balancer.
Menggunakan fungsi Laravel Request :: ip () akan mendapatkan IP proxy yang paling tepat tetapi bukan IP klien.
Anda dapat mencoba solusi berikut.
app / Http / Middleware / TrustProxies.php
Referensi: https://github.com/fideloper/TrustedProxy/issues/107#issuecomment-373065215
sumber
Saya menggunakan fungsi Sebastien Horin getIp dan request () -> ip () (atas permintaan global), karena untuk localhost fungsi getIp mengembalikan null:
$this->getIp() ?? request()->ip();
Fungsi getIp:
}
sumber
Saat kami menginginkan pengguna
ip_address
:dan ingin alamat server:
sumber
sumber