Данный подход скорее полезен как демонстрация инструментария, чем действительно реализация редиректа на основной домен. Потому что лучше это делать средствами сервера, а не ПО, чтобы уменьшить нагрузку на сервер.
Drupal 8 работает на базе симфонии, а та реализует т.н. очередь событий ядра, которые возникают в течении процесса обработки запроса (request).
Во 2й версии Symfony доступны следующие события ядра:
- KernelEvents::CONTROLLER — Возникает, когда найден контроллер для обработки запроса
- KernelEvents::EXCEPTION — …, когда случается EXCEPTION, у которого нет обработки.
- KernelEvents::FINISH_REQUEST — …, когда ответ на запрос уже сформирован и готов к отправке.
- KernelEvents::REQUEST — … в самом начале получения запроса.
- KernelEvents::RESPONSE — … сразу после создания ответа на запрос.
- KernelEvents::TERMINATE — … как только ответ был отправлен.
- KernelEvents::VIEW — …, если возвращаемое значение контроллера не является экземпляром Response.
Нам нужно зацепиться за KernelEvents::REQUEST, чтобы сформировать требуемый редирект. Реализуется это через создание подписки на события.
В исходниках вашего модуля (/src) добавьте следующий класс src/EventSubscriber.php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<?php namespace Drupal\mymodule; use Drupal\Core\Routing\TrustedRedirectResponse; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\KernelEvents; class EventSubscriber implements EventSubscriberInterface { static $preferedDomain = 'domain.where.redirect.com'; static $devDomain = 'dev.domain'; public function customRedirect(RequestEvent $event) { $request = $event->getRequest(); $route_name = $request->attributes->get('_route'); $host = $request->getHttpHost(); // если метод запроса GET, а хост отличается // от дев хоста или прод хоста, то сделаем редирект if ($request->getMethod() == 'GET' && !in_array($host, [self::$devDomain, self::$preferedDomain])) { $url = 'https://' . self::$preferedDomain . $request->getRequestUri(); // для внешнего редиректа требуется использовать // класс TrustedRedirectResponse $event->setResponse(new TrustedRedirectResponse($url, 301)); // 301 - это код "постоянного" редиректа } } /** * {@inheritdoc} */ public static function getSubscribedEvents() { // подписываем на событие KernelEvents::REQUEST // нашу функцию редиректа return [KernelEvents::REQUEST => [['customRedirect']]]; } } |