Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I need to store the IP address of the users who comment, in the database after form submission.

Is there any symfony2 function to get the IP? Or any other way to get the IP?

like image 379
VishwaKumar Avatar asked Jan 27 '12 06:01

VishwaKumar


2 Answers

You can get the client IP using Request service:

$container->get('request')->getClientIp(); 
like image 143
meze Avatar answered Sep 24 '22 20:09

meze


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(); 
like image 41
6 revs Avatar answered Sep 25 '22 20:09

6 revs