How do I get the user IP address in Symfony2 controller?

Solution 1:

You can get the client IP using Request service:

$container->get('request')->getClientIp();

Solution 2:

In Symfony before 2.3 $this->container->get('request')->getClientIp() works only inside of master request controller. In sub-request controller this always returns 127.0.0.1. In case your project uses sub-requests with Symfony 2.2, the bullet-proof solution is to create kernel.request listener and save the IP from the master request in it.

In Symfony 2.3 this was fixed so for internal sub-requests the real IP is pushed to the list of proxies, see https://github.com/symfony/symfony/commit/2f3b33a630727cbc9cf21262817240a72a8dae0c So you need to add 127.0.0.1 to trusted_proxies configuration parameter to get client ip from the Request in sub-requests in Symfony 2.3+, but you shouldn't do this on shared hosting for security reasons.

Also, 127.0.0.1 had to be added to trusted_proxies explicitly if built-in HTTP cache (AppCache in web/app.php) was used before Symfony 2.3.20. This cache tries to look like a real reverse-proxy and modifies some headers of master request. Fixed in https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9

Since Symfony 2.4 and in 3.x the preferred way to access current request is either using request_stack service

$this->container->get('request_stack')->getCurrentRequest()->getClientIp();

or injecting Request into controller, see http://symfony.com/doc/current/book/controller.html#the-request-as-a-controller-argument

public function indexAction(Request $request)
{
    $ip = $request->getClientIp();
}

But the concern about excluding 127.0.0.1 when used in sub-requests still apply, but now you may try to explicitly refer to master request using

$this->container->get('request_stack')->getMasterRequest()->getClientIp();

Solution 3:

FYI, As of Symfony 2.0 Request::getClientIp the $proxy parameter is deprecated. It will be removed in Symfony 2.3.

You can either use

$container->get('request')->server->get("REMOTE_ADDR");

or as @meze answer

$container->get('request')->getClientIp();