Betrachten der Laravel-API :
Request::ip();
Intern wird die getClientIps
Methode aus dem Symfony-Anforderungsobjekt verwendet :
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);
}
Wenn Sie sich unter einem Load Balancer befinden, gibt Laravel's
\Request::ip()
immer die IP des Balancers zurück:Diese benutzerdefinierte Methode gibt die tatsächliche Client-IP zurück:
Darüber hinaus empfehle ich Ihnen, mit der Gas- Middleware von Laravel sehr vorsichtig umzugehen : Sie verwendet auch die von Laravel
Request::ip()
, sodass alle Ihre Besucher als derselbe Benutzer identifiziert werden und Sie das Gaslimit sehr schnell erreichen. Ich habe das live erlebt und das hat große Probleme verursacht.Um dies zu beheben:
Illuminate \ Http \ Request.php
Sie können jetzt auch verwenden
Request::ip()
, was die reale IP in der Produktion zurückgeben soll.quelle
Verwenden Sie
request()->ip()
.Soweit ich weiß, wird seit Laravel 5 empfohlen, die globalen Funktionen wie folgt zu verwenden:
Und wenn überhaupt, leuchtet meine IDE bei Verwendung der Funktionen anstelle der statischen Notation nicht wie ein Weihnachtsbaum.
quelle
request
ist eine "globale" Funktion - es ist eine der globalen Hilfsfunktionen, die von Laravel bereitgestellt werden. Allerdings, die Anfrage Fassade ist nicht statisch (noch ist die Methode ip) -request()->foo
, undReqest::foo
und$request->foo
sind alle identisch. Schauen Sie sich diesen Kern für ein Beispiel an: gist.github.com/cjke/026e3036c6a10c672dc5Request::ip
könnte nicht irreführend seinrequest()->ip()
korrekt ist, wird der umgebende Text wirklich irreführend - vor allem zu sagen , „es ist nichtRequest::ip
.Namespace hinzufügen
Rufen Sie dann die Funktion auf
quelle
use Request
weil Sie versuchen, die Fassade zu verwenden. Der von Ihnen angegebene Namespace gilt für die zugrunde liegende Klasse. Wenn Sie importieren, dass Sie eine Fehlermeldung erhalten, weilip()
sie nicht statisch aufgerufen werden kann, ist die Fassade dafür gedacht.use Illuminate\Support\Facades\Request
. Wenn nicht, einfach verwenden\Request::
.Für Laravel 5 können Sie das Request-Objekt verwenden. Nennen Sie einfach seine
ip()
Methode, so etwas wie:quelle
In Laravel 5
quelle
Es gibt zwei Dinge zu erledigen:
Holen Sie sich eine Hilfsfunktion, die a zurückgibt,
Illuminate\Http\Request
und rufen Sie die->ip()
Methode auf:Denken Sie an Ihre Serverkonfiguration, sie verwendet möglicherweise einen Proxy oder
load-balancer
insbesondere in einer AWS ELB-Konfiguration.In diesem Fall müssen Sie " Konfigurieren vertrauenswürdiger Proxies " befolgen oder sogar die Option "Vertrauenswürdige Proxies" festlegen.
Warum? Weil Sie als Server stattdessen Ihren Proxy / Ihre
load-balancer
IP erhalten.Wenn Sie sich im AWS Balance-Loader befinden, gehen Sie zu
App\Http\Middleware\TrustProxies
und lassen Sie die$proxies
Deklaration folgendermaßen aussehen:Testen Sie es jetzt und feiern Sie, weil Sie sich gerade vor Problemen mit der Gas-Middleware bewahrt haben. Es ist auch
request()->ip()
abhängig von und ohne "TrustProxies" einzurichten, können Sie alle Ihre Benutzer daran hindern, sich anzumelden, anstatt nur die IP des Täters zu blockieren.Und da die Gas-Middleware in der Dokumentation nicht richtig erklärt wird, empfehle ich, das " Laravel 5.2-Tutorial für Anfänger, API Rate Limiting " zu lesen.
Getestet in Laravel 5.7
quelle
In Laravel 5.4 können wir ip static nicht aufrufen. Dies ist ein korrekter Weg, um die IP des Benutzers zu erhalten:
quelle
Wenn Sie diese Funktion aufrufen, erhalten Sie leicht die IP-Adresse des Clients. Ich habe dies bereits in meinem bestehenden Projekt verwendet:
quelle
Wenn Sie immer noch 127.0.0.1 als IP erhalten, müssen Sie Ihren "Proxy" hinzufügen, aber beachten Sie, dass Sie ihn ändern müssen, bevor Sie mit der Produktion beginnen!
Lesen Sie " Konfigurieren vertrauenswürdiger Proxies ".
Und füge dies hinzu:
Jetzt
request()->ip()
gibt Ihnen die richtige IP.quelle
Wenn Sie die Client-IP möchten und Ihr Server hinter aws elb steht, geben Sie den folgenden Code ein. Getestet auf Laravel 5.3
quelle
Wenn Sie wie CDN + Load Balancer über mehrere Layer-Proxys verfügen.
Bei Verwendung der Funktion Laravel Request :: ip () wird die Proxy-IP ganz rechts, jedoch nicht die Client-IP abgerufen.
Sie können versuchen, folgende Lösung.
app / Http / Middleware / TrustProxies.php
Referenz: https://github.com/fideloper/TrustedProxy/issues/107#issuecomment-373065215
quelle
Ich habe die Sebastien Horin-Funktion getIp und request () -> ip () (auf globale Anfrage) verwendet, da die getIp-Funktion für localhost null zurückgibt:
$this->getIp() ?? request()->ip();
Die getIp-Funktion:
}}
quelle
Wenn wir wollen, dass der Benutzer
ip_address
:und Serveradresse wollen:
quelle
quelle