logger = $c->logger; $this->container = $c; } public function __invoke(Request $req, Response $res, callable $next) { $proxys = $this->container['config']['proxys']; $headerContent = $req->getHeaderLine('X-Forwarded-For'); if (strlen($headerContent) === 0) { $ip = $_SERVER['REMOTE_ADDR']; } else { if (!in_array($_SERVER['REMOTE_ADDR'], $proxys)) { // Client is not trusted proxy $ip = $_SERVER['REMOTE_ADDR']; } else { $parts = array_map('trim', explode(',', $headerContent)); $ip = $_SERVER['REMOTE_ADDR']; for ($i = count($parts) - 1; $i >= 0; $i--) { if (!in_array($parts[$i], $proxys)) { $ip = $parts[$i]; break; } } } } $req = $req->withAttribute('clientIp', $ip); return $next($req, $res); } }