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

Vis*_*mar 68 ip-address symfony

我需要在表单提交后在数据库中存储注释用户的IP地址.

是否有任何symfony2函数来获取IP?或任何其他方式获得IP?

mez*_*eze 143

您可以使用请求服务获取客户端IP:

$this->container->get('request')->getClientIp();
Run Code Online (Sandbox Code Playgroud)

  • 好了它的工作原理:$ ip = $ this-> container-> get('request') - > getClientIp(); (14认同)
  • 请注意,最佳实践是直接使用注入的“$request”,而不是从容器中获取它,因此只需使用“$request->getClientIp()”就足够了 (3认同)

Kon*_*lin 47

在Symfony 2.3之前 $this->container->get('request')->getClientIp()只在主请求控制器内部工作.在子请求控制器中,它总是返回127.0.0.1.如果您的项目使用Symfony 2.2的子请求,则防弹解决方案是创建kernel.request侦听器并从其中的主请求中保存IP.

在Symfony的2.3这是固定所以对于真正的IP被推到代理服务器列表内的子请求,见https://github.com/symfony/symfony/commit/2f3b33a630727cbc9cf21262817240a72a8dae0c 所以你需要添加127.0.0.1trusted_proxies配置参数,以获得客户端来自Symfony 2.3+中的子请求中的请求的ip,但出于安全原因,您不应该在共享主机上执行此操作.

此外,如果在Symfony 2.3.20之前使用内置HTTP缓存(in ),则127.0.0.1必须trusted_proxies明确添加.此缓存尝试看起来像真正的反向代理并修改主请求的某些标头.在https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9中修复AppCacheweb/app.php

从Symfony 2.43.x开始,访问当前请求的首选方法是使用request_stack服务

$this->container->get('request_stack')->getCurrentRequest()->getClientIp();
Run Code Online (Sandbox Code Playgroud)

或将请求注入控制器,请参阅http://symfony.com/doc/current/book/controller.html#the-request-as-a-controller-argument

public function indexAction(Request $request)
{
    $ip = $request->getClientIp();
}
Run Code Online (Sandbox Code Playgroud)

但是在子请求中使用时排除127.0.0.1的问题仍然适用,但现在您可能尝试使用显式引用主请求

$this->container->get('request_stack')->getMasterRequest()->getClientIp();
Run Code Online (Sandbox Code Playgroud)


yvo*_*yer 17

仅供参考,截至Symfony 2.0 Request::getClientIp$proxy 参数弃用.它将在Symfony 2.3中删除.

你可以使用

$container->get('request')->server->get("REMOTE_ADDR");
Run Code Online (Sandbox Code Playgroud)

或者@meze回答

$container->get('request')->getClientIp();
Run Code Online (Sandbox Code Playgroud)

  • 我从不推荐使用REMOTE_ADDR。它可能在您的开发机器上本地工作,但是如果您的生产应用程序前面有任何反向代理或负载平衡器,您的代码就会中断。getClientIp()是在Symfony中获取客户端IP的唯一可信赖的方法。 (2认同)

sha*_*sol 7

对于Symfony 2.6+,请使用以下代码(在您的控制器中:

      $this->container->get('request_stack')->getCurrentRequest()->getClientIp();
Run Code Online (Sandbox Code Playgroud)