Nếu bạn ở dưới bộ cân bằng tải, thì Laravel \Request::ip()
luôn trả về IP của bộ cân bằng:
echo $request->ip();
// server ip
echo \Request::ip();
// server ip
echo \request()->ip();
// server ip
echo $this->getIp(); //see the method below
// clent ip
Phương thức tùy chỉnh này trả về ip máy khách thực sự:
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;
}
}
}
}
}
Ngoài ra, tôi khuyên bạn nên hết sức cẩn thận khi sử dụng phần mềm trung gian bướm ga của Laravel : Nó cũng sử dụng của Laravel Request::ip()
, vì vậy tất cả khách truy cập của bạn sẽ được xác định là cùng một người dùng và bạn sẽ nhanh chóng đạt đến giới hạn bướm ga. Tôi đã trải nghiệm trực tiếp và điều này gây ra vấn đề lớn.
Để khắc phục điều này:
Chiếu sáng \ http \ Request.php
public function ip()
{
//return $this->getClientIp(); //original method
return $this->getIp(); // the above method
}
Bây giờ bạn cũng có thể sử dụng Request::ip()
, sẽ trả lại IP thực trong sản xuất.