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地址来自哪里:

  1. 客户端的浏览器向 http://example.com 发出请求。
  2. Web-server 捕获请求及其信息,如 IP 地址、headers 等。
  3. Web-server 将此请求转发到后端 (symfony) 并传递请求信息。
  4. Symfony 从使用 web-server 提供的信息填写 master Request object 开始执行过程。

所以最后你得到 real 客户端 IP 地址,而不是被调用子请求的某些操作覆盖的 IP 地址。

但是当你使用负载均衡器时有一个例外,在这种情况下请阅读官方文档:

How to Configure Symfony to Work behind a Load Balancer or a Reverse Proxy