首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >西佛尼3.4 RequestStack -> MasterRequest -> ClientIp

西佛尼3.4 RequestStack -> MasterRequest -> ClientIp
EN

Stack Overflow用户
提问于 2018-05-18 21:36:08
回答 1查看 600关注 0票数 0

我完全理解我在本地主机上测试它,但我不知道它是否应该返回我的笔记本电脑的真实IP,或者在以下每一种情况下实际上都是一个环回'::1‘.它在生产中的工作方式是不同的,还是我遗漏了一点?

来自控制器

代码语言:javascript
复制
 <?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);
  }

}

来自侦听器的

代码语言:javascript
复制
<?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();
  }

  // ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-18 22:19:44

你这样做是对的。让我们看看IP地址从何而来:

  1. 客户端浏览器向http://example.com提出请求。
  2. Web服务器捕获请求及其信息,如IP地址、报头等。
  3. Web服务器将此请求转发给后端(symfony)并传递请求信息。
  4. Symfony从使用web服务器提供的信息填充主Request对象开始执行过程。

因此,最终您将得到real客户端IP地址,而不是被一些称为子请求的操作所覆盖的地址。

但是,在使用负载均衡器时,有一个例外,在本例中,只需阅读正式文档:

如何将Symfony配置为在负载均衡器或反向代理之后工作

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50419568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档