提交表单后,我需要在数据库中存储评论用户的IP地址。
是否有任何symfony2函数来获取IP?还是通过其他方式获取IP?
提交表单后,我需要在数据库中存储评论用户的IP地址。
是否有任何symfony2函数来获取IP?还是通过其他方式获取IP?
Answers:
您可以使用请求服务获取客户端IP:
$container->get('request')->getClientIp();
$request
直接使用注射剂,而不是从容器中取出,因此只需使用$request->getClientIp()
就足够了
在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.1
到trusted_proxies
配置参数中以获取客户端ip从Symfony 2.3+的子请求中的Request中获取IP,但是出于安全原因,您不应该在共享主机上执行此操作。
此外,如果在Symfony 2.3.20之前使用了内置的HTTP缓存(in ),则127.0.0.1
必须trusted_proxies
显式添加。该缓存试图看起来像一个真正的反向代理,并修改了主请求的某些标头。已在https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9中修复AppCache
web/app.php
从Symfony 2.4和3.x开始,访问当前请求的首选方法是使用request_stack
service
$this->container->get('request_stack')->getCurrentRequest()->getClientIp();
或将请求注入控制器,请参见http://symfony.com/doc/current/book/controller.html#the-request-as-a-controller-argument
public function indexAction(Request $request)
{
$ip = $request->getClientIp();
}
但是,在子请求中使用127.0.0.1时仍需排除的问题仍然存在,但是现在您可以尝试使用
$this->container->get('request_stack')->getMasterRequest()->getClientIp();