如何在 Symfony2控制器中获取用户 IP 地址?

我需要存储的 IP 地址谁的用户评论,在数据库后提交表单。

有没有任何 symfony2函数来获取 IP? 或者其他获取 IP 的方法?

87630 次浏览

You can get the client IP using Request service:

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

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();

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();

For Symfony 2.6+ use the following code (within your controller:

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

there is also another way to inject the current client IP into any service or method call:

acme.currentIP:
class: some\service\className
arguments:
- "@=service('request_stack').getCurrentRequest().getClientIp()"