Symfony 3.4 RequestStack -> MasterRequest -> ClientIp
Symfony 3.4 RequestStack -> MasterRequest -> ClientIp
我完全理解我在我的本地主机上测试它,但我想知道它是否应该 return 我笔记本电脑的真实 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();
}
// ...
你做的对。让我们看看IP地址来自哪里:
- 客户端的浏览器向 http://example.com 发出请求。
- Web-server 捕获请求及其信息,如 IP 地址、headers 等。
- Web-server 将此请求转发到后端 (symfony) 并传递请求信息。
- Symfony 从使用 web-server 提供的信息填写 master
Request
object 开始执行过程。
所以最后你得到 real
客户端 IP 地址,而不是被调用子请求的某些操作覆盖的 IP 地址。
但是当你使用负载均衡器时有一个例外,在这种情况下请阅读官方文档:
How to Configure Symfony to Work behind a Load Balancer or a Reverse Proxy
我完全理解我在我的本地主机上测试它,但我想知道它是否应该 return 我笔记本电脑的真实 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();
}
// ...
你做的对。让我们看看IP地址来自哪里:
- 客户端的浏览器向 http://example.com 发出请求。
- Web-server 捕获请求及其信息,如 IP 地址、headers 等。
- Web-server 将此请求转发到后端 (symfony) 并传递请求信息。
- Symfony 从使用 web-server 提供的信息填写 master
Request
object 开始执行过程。
所以最后你得到 real
客户端 IP 地址,而不是被调用子请求的某些操作覆盖的 IP 地址。
但是当你使用负载均衡器时有一个例外,在这种情况下请阅读官方文档:
How to Configure Symfony to Work behind a Load Balancer or a Reverse Proxy