How do I get the user IP address in Symfony2 controller?
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();
You can get the client IP using Request service:
$container->get('request')->getClientIp();