Посмотрим на Laravel API :
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);
}
Если вы используете балансировщик нагрузки, Laravel
\Request::ip()
всегда возвращает IP-адрес балансировщика:Этот специальный метод возвращает реальный IP-адрес клиента:
В дополнение к этому я предлагаю вам быть очень осторожными при использовании промежуточного программного обеспечения Laravel throttle : оно использует Laravel's
Request::ip()
, так что все ваши посетители будут идентифицированы как тот же пользователь , и вы будете очень быстро ударили дроссельный предел. Я испытал это вживую, и это вызвало большие проблемы.Чтобы исправить это:
Осветите \ Http \ Request.php
Теперь вы также можете использовать
Request::ip()
, который должен возвращать реальный IP-адрес в производстве.источник
использование
request()->ip()
.Насколько я понимаю, начиная с Laravel 5 рекомендуется / хорошая практика использовать глобальные функции, такие как:
И, во всяком случае, при использовании функций вместо статической нотации моя IDE не загорается, как рождественская елка.
источник
request
это «глобальная» функция - это одна из глобальных вспомогательных функций, предоставляемых laravel. Однако запрос фасад, не является статичным (ни метод ф) -request()->foo
иReqest::foo
и$request->foo
все одинаковые. Взгляните на эту суть для примера: gist.github.com/cjke/026e3036c6a10c672dc5Request::ip
может вводить в заблуждение»request()->ip()
правильно, окружающий текст действительно вводит в заблуждение - особенно сказать «это неRequest::ip
.Добавить пространство имен
Затем вызовите функцию
источник
use Request
потому что вы пытаетесь использовать фасад. Предоставленное вами пространство имен предназначено для базового класса. Если вы импортируете это, вы получите ошибку, потому чтоip()
не может быть вызван статически, для этого и нужен фасад.use Illuminate\Support\Facades\Request
. Если нет, просто используйте\Request::
.Для Laravel 5 вы можете использовать объект Request. Просто вызовите его
ip()
метод, например:источник
В Laravel 5
источник
Необходимо позаботиться о двух вещах:
Получите вспомогательную функцию, которая возвращает,
Illuminate\Http\Request
и вызовите->ip()
метод:Подумайте о конфигурации вашего сервера, он может использовать прокси или
load-balancer
, особенно в конфигурации AWS ELB.Если это ваш случай, вам необходимо выполнить « Настройка доверенных прокси » или, возможно, даже установить параметр «Доверять всем прокси».
Зачем? Потому что, будучи вашим сервером,
load-balancer
вместо этого вы получите ваш прокси / IP.Если вы используете балансировщик AWS, перейдите на страницу
App\Http\Middleware\TrustProxies
и сделайте$proxies
объявление, как это:Теперь протестируйте его и отпразднуйте, потому что вы только что избавили себя от проблем с промежуточным программным обеспечением газа. Он также полагается на
request()->ip()
и без настройки «TrustProxies», вы можете заблокировать для всех пользователей вход в систему, вместо того, чтобы блокировать только IP-адрес преступника.И поскольку промежуточное программное обеспечение дроссельной заслонки не объясняется должным образом в документации, я рекомендую посмотреть « Учебник по laravel 5.2 для начинающих, ограничение скорости API »
Протестировано в Laravel 5.7
источник
В Laravel 5.4 мы не можем вызывать ip static. Это правильный способ получить IP пользователя:
источник
Если вы вызовете эту функцию, вы легко получите IP-адрес клиента. Я уже использовал это в своем существующем проекте:
источник
Если вы все еще получаете 127.0.0.1 в качестве IP-адреса, вам необходимо добавить свой «прокси», но имейте в виду, что вы должны изменить его перед запуском в производство!
Прочтите « Настройка доверенных прокси ».
И добавьте это:
Теперь
request()->ip()
дает вам правильный IP.источник
Если вам нужен IP-адрес клиента, а ваш сервер находится за aws elb, используйте следующий код. Протестировано на laravel 5.3
источник
Если у вас многоуровневые прокси, такие как CDN + Load Balancer.
Использование функции Laravel Request :: ip () получит самый правый IP-адрес прокси, но не IP-адрес клиента.
Вы можете попробовать следующее решение.
приложение / Http / Промежуточное / TrustProxies.php
Ссылка: https://github.com/fideloper/TrustedProxy/issues/107#issuecomment-373065215
источник
Я использовал функции Себастьяна Хорина getIp и request () -> ip () (по глобальному запросу), потому что для localhost функция getIp возвращает null:
$this->getIp() ?? request()->ip();
Функция getIp:
}
источник
Когда мы хотим, чтобы пользователь
ip_address
:и хотите получить адрес сервера:
источник
источник