【发布时间】:2012-02-20 05:36:09
【问题描述】:
我需要在提交表单后将评论用户的IP地址存储在数据库中。
symfony2 有没有获取 IP 的函数?或者其他方式获取IP?
【问题讨论】:
标签: symfony ip-address
我需要在提交表单后将评论用户的IP地址存储在数据库中。
symfony2 有没有获取 IP 的函数?或者其他方式获取IP?
【问题讨论】:
标签: symfony ip-address
您可以使用请求服务获取客户端 IP:
$container->get('request')->getClientIp();
【讨论】:
$request,而不是从容器中抓取,所以只需使用$request->getClientIp()就足够了
仅供参考,从 Symfony 2.0 开始,Request::getClientIp$proxy parameter 是 deprecated。它将在 Symfony 2.3 中删除。
你可以使用
$container->get('request')->server->get("REMOTE_ADDR");
或@meze 回答
$container->get('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
所以你需要在 Symfony 2.3+ 的子请求中添加 127.0.0.1 到 trusted_proxies 配置参数来获取客户端 ip,但是出于安全原因你不应该在共享主机上这样做。
此外,如果在 Symfony 2.3.20 之前使用内置 HTTP 缓存(AppCache in web/app.php),则必须将 127.0.0.1 显式添加到 trusted_proxies。这个缓存试图看起来像一个真正的反向代理,并修改了一些主请求的标头。修复于https://github.com/symfony/symfony/commit/902efb8a84e8f0acf6a63e09afa08e3dcdd80fb9
从 Symfony 2.4 和 3.x 开始,访问当前请求的首选方式是使用 request_stack 服务
$this->container->get('request_stack')->getCurrentRequest()->getClientIp();
或将Request注入控制器,见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();
【讨论】:
对于 Symfony 2.6+,使用以下代码(在您的控制器中:
$this->container->get('request_stack')->getCurrentRequest()->getClientIp();
【讨论】:
还有另一种方法可以将当前客户端 IP 注入到任何服务或方法调用中:
acme.currentIP:
class: some\service\className
arguments:
- "@=service('request_stack').getCurrentRequest().getClientIp()"
【讨论】: