Как получить IP-адрес клиента в Laravel 5.1?

Я пытаюсь получить IP-адрес клиента в Laravel. Как мы все знаем, гораздо проще получить IP-адрес клиента на PHP с помощью $_SERVER["REMOTE_ADDR"] .

Он отлично работает в основном PHP, но когда я использую то же самое в Laravel, он дает IP-адрес сервера вместо IP-адреса посетителя.

Глядя на API Laravel :

 Request::ip(); 

Внутри он использует метод getClientIps из объекта запроса 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); } не 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 (насколько я понимаю) рекомендовал / передовую практику использовать глобальные функции, такие как:

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

Вы понимаете 🙂 И если что-либо, при использовании функций (вместо статического нотариуса) моя 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

В дополнение к этому я предлагаю вам быть очень осторожным, используя промежуточное ПО дроссельной заслонки Laravel: он также использует Laravel's 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();

В Ларавеле 5

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

в версии laravel 5.4 мы не можем вызвать ip static, это правильный способ получить ip-пользователя

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

Если вы хотите, чтобы клиентский IP-адрес и ваш сервер находились за aws-elb, тогда введите следующий код. Протестировано для laravel 5.3

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

Когда мы хотим ip_address пользователя:

 $_SERVER['REMOTE_ADDR'] 

и хотите адрес сервера:

 $_SERVER['SERVER_ADDR']