如何在Laravel 5.1中获取客户端IP地址?

我正在尝试在Laravel中获取客户端的IP地址。 众所周知,通过使用$_SERVER["REMOTE_ADDR"]来获取客户端的IP在PHP中是非常容易的。

它在核心PHP中工作正常,但是当我在Laravel中使用相同的东西时,它会给服务器IP而不是访问者IP。

看一下Laravel API :

 Request::ip(); 

在内部,它使用Symfony Request Object中的getClientIps方法:

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

使用request()->ip() 🙂

自Laravel 5以来(从我的理解)build议/良好的做法,使用全球function,如:

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

你得到的重点:-)如果有的话,当使用函数(而不是静态notarion),我的IDE不像圣诞树; – )

添加命名空间

 use Request; 

然后调用该函数

 Request::ip(); 

如果您在负载平衡器下

Laravel的\Request::ip() 总是返回平衡器的IP

  echo $request->ip(); // server ip echo \Request::ip(); // server ip echo \request()->ip(); // server ip echo $this->getIp(); //see the method below // clent ip 

这个方法返回真实的客户端ip:

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

更多:如果您使用Laravel的油门中间件

除此之外,我build议你使用Laravel的油门中间件时要非常小心:它也使用Laravel的Request::ip() ,所以你的所有访问者将被识别为同一个用户,你将很快达到油门极限。 在生活中经历过…这导致了我的重大问题…

要解决这个问题:

照亮\ HTTP \ Request.php

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

您现在也可以使用Request::ip() ,它应该返回生产中的真实IP

对于Laravel 5,您可以使用Request对象。 只需调用它的ip()方法。 就像是:

$request->ip();

在Laravel 5

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

在版本laravel 5.4我们不能调用ip静态这是一个正确的方式来获得ip用户

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

如果你想要客户端IP,而你的服务器在aws elb后面,那么请使用下面的代码。 testing的laravel 5.3

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

当我们想要用户的ip_address

 $_SERVER['REMOTE_ADDR'] 

并想要服务器地址:

 $_SERVER['SERVER_ADDR']