actionFactory = $actionFactory; $this->url = $url; $this->storeManager = $storeManager; $this->response = $response; $this->urlFinder = $urlFinder; } /** * Match corresponding URL Rewrite and modify request. * * @param RequestInterface|HttpRequest $request * * @return ActionInterface|null */ public function match(RequestInterface $request) { $rewrite = $this->getRewrite( $request->getPathInfo(), $this->storeManager->getStore()->getId() ); if ($rewrite === null) { //No rewrite rule matching current URl found, continuing with //processing of this URL. return null; } if ($rewrite->getRedirectType()) { //Rule requires the request to be redirected to another URL //and cannot be processed further. return $this->processRedirect($request, $rewrite); } //Rule provides actual URL that can be processed by a controller. $request->setAlias( UrlInterface::REWRITE_REQUEST_PATH_ALIAS, $rewrite->getRequestPath() ); $request->setPathInfo('/' . $rewrite->getTargetPath()); return $this->actionFactory->create( \Magento\Framework\App\Action\Forward::class ); } /** * @param RequestInterface $request * @param UrlRewrite $rewrite * * @return ActionInterface|null */ protected function processRedirect($request, $rewrite) { $target = $rewrite->getTargetPath(); if ($rewrite->getEntityType() !== Rewrite::ENTITY_TYPE_CUSTOM || ($prefix = substr($target, 0, 6)) !== 'http:/' && $prefix !== 'https:' ) { $target = $this->url->getUrl('', ['_direct' => $target]); } return $this->redirect($request, $target, $rewrite->getRedirectType()); } /** * @param RequestInterface|HttpRequest $request * @param string $url * @param int $code * @return ActionInterface */ protected function redirect($request, $url, $code) { $this->response->setRedirect($url, $code); $request->setDispatched(true); return $this->actionFactory->create(Redirect::class); } /** * @param string $requestPath * @param int $storeId * @return UrlRewrite|null */ protected function getRewrite($requestPath, $storeId) { return $this->urlFinder->findOneByData([ UrlRewrite::REQUEST_PATH => ltrim($requestPath, '/'), UrlRewrite::STORE_ID => $storeId, ]); } }