我完全理解我在本地主机上测试它,但我想知道它是否应该返回我的笔记本电脑的真实IP或者实际上是一个环回' :: 1 '在以下每种情况下......它在生产中的工作方式是否有所不同,还是我错过了一个观点?
来自控制器
<?php
namespace SD\UserBundle\Controller;
use FOS\UserBundle\Controller\SecurityController as OriginalController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
class SecurityController extends OriginalController
{
public function loginAction(Request $request)
{
$clientIp = $this->get('request_stack')
->getMasterRequest()
->getClientIp()
;
if($this->get('sd_user.ip_foresight')->isBlackListed($clientIp))
{
return new RedirectResponse(
$this->generateUrl('sd_user_forbidden')
);
}
return parent::loginAction($request);
}
}
来自听众
<?php
namespace SD\UserBundle\EventListener;
use Symfony\Component\HttpFoundation\RequestStack;
class IpListener implements EventSubscriberInterface
{
protected $requestStack;
public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}
public function clientIp()
{
return $this->requestStack->getMasterRequest()->getClientIp();
}
// ...
答案 0 :(得分:2)
你正在以正确的方式做到这一点。让我们看看IP地址的来源:
Request
对象的执行过程。所以最后你获得了real
个客户端IP地址,而不是被一些调用子请求的动作覆盖的地址。
但是在使用负载均衡器时有一个例外,在这种情况下只需阅读官方文档:
How to Configure Symfony to Work behind a Load Balancer or a Reverse Proxy