我想创建一些服务,负责将某些路由自动重定向到安全版本的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]
但是我还需要更改主机。我应该挂钩一些内核事件吗?
答案 0 :(得分:1)
我最终得到的是:
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
选项,如果是,则检查它是否在安全连接上 - 如果没有,则重定向到安全域。
答案 1 :(得分:0)
您可以使用监听器Symfony\Component\HttpKernel\KernelEvents::REQUEST
事件,文档如何在此处创建类似的侦听器:http://symfony.com/doc/current/cookbook/service_container/event_listener.html。这样您就可以添加所需的任何逻辑。您将GetResponseEvent
作为参数,因此您只需从方法返回或将重定向响应设置为该事件。