【问题标题】:Symfony - Auto redirectSymfony - 自动重定向
【发布时间】:2013-09-10 13:03:44
【问题描述】:

我想创建一些服务,负责将某些路由自动重定向到安全版本的 URL。例如:

http://domain.com/checkout -> https://secure.domain.com/checkout
http://domain.com/about // route not marked as secure, no redirection

我知道我可以通过架构部分实现这一点:

secure:
    path:     /secure
    defaults: { _controller: AcmeDemoBundle:Main:secure }
    schemes:  [https]

不过,我还需要更换主机。我应该连接一些内核事件吗?

【问题讨论】:

  • 使用standardredirection有什么问题吗?
  • 为什么不使用.htaccess
  • @ThomasK,这将是一个有效的选择,但是我们不想维护两个工具(路由器和 htaccess)来实现如此简单的事情。这只是一致性问题。

标签: php symfony symfony-2.3


【解决方案1】:

您可以使用监听器来Symfony\Component\HttpKernel\KernelEvents::REQUEST 事件,文档如何在此处创建类似的监听器:http://symfony.com/doc/current/cookbook/service_container/event_listener.html。这样你就可以添加你需要的任何逻辑。你得到GetResponseEvent 作为参数,所以你可以从方法返回或设置对那个事件的重定向响应。

【讨论】:

    【解决方案2】:

    我最终得到的是:

    1) 我在路由中设置了自定义选项 (https):

    acme_dynamic:
        pattern:  /
        options:
            https: true
        defaults:
            _controller: acmeCommonBundle:Default:dynamic
    

    2) 我为kernel.response 事件创建了一个监听器:

    namespace acme\CommonBundle\EventListener;
    
    use acme\CommonBundle\Controller\HttpsController;
    use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
    
    class HttpsControllerListener
    {
        /**
         * Base HTTPS Url
         * @var string
         */
        private $httpsUrl;
    
        /**
         * Request
         * @var [type]
         */
        private $request;
    
        /**
         * [$router description]
         * @var [type]
         */
        private $router;
    
        public function __construct($httpsUrl, $request, $router)
        {
            $this->httpsUrl = $httpsUrl;
            $this->router = $router;
            $this->request = $request;
        }
    
        public function onKernelResponse(FilterResponseEvent $event)
        {
            $routeCollection = $this->router->getRouteCollection();
            $route = $routeCollection->get($this->request->get('_route'));
    
            if ($route and $route->getOption('https') === true and $this->request->server->get('HTTPS')) {
                $response = $event->getResponse();
                $event->setResponse(new RedirectResponse($this->httpsUrl . $this->request->server->get('REQUEST_URI')));
            }
        }
    }
    

    3) 我已将其注册到提到的事件:

    acme.https_controller_listener:
        class: acme\CommonBundle\EventListener\HttpsControllerListener
        arguments: [%baseurl.https%, @request, @router]
        scope: request
        tags:
            - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }
    

    基本上它会拦截响应,检查当前路由是否在路由配置中设置了https 选项,如果是,则检查它是否在安全连接上 - 如果不是,则重定向到安全域。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      • 2014-01-19
      • 2015-06-24
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多