vendor/contao/core-bundle/src/Resources/contao/pages/PageError404.php line 80

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of Contao.
  4.  *
  5.  * (c) Leo Feyer
  6.  *
  7.  * @license LGPL-3.0-or-later
  8.  */
  9. namespace Contao;
  10. use Contao\CoreBundle\Exception\ForwardPageNotFoundException;
  11. use Contao\CoreBundle\Exception\PageNotFoundException;
  12. use Contao\CoreBundle\Util\LocaleUtil;
  13. use Symfony\Component\HttpFoundation\Response;
  14. /**
  15.  * Provide methods to handle an error 404 page.
  16.  */
  17. class PageError404 extends Frontend
  18. {
  19.     /**
  20.      * Generate an error 404 page
  21.      *
  22.      * @param PageModel|null $page
  23.      *
  24.      * @deprecated Deprecated since Contao 4.9, to be removed in Contao 5; use
  25.      *             the PageError404::getResponse() method instead
  26.      */
  27.     public function generate($page=null)
  28.     {
  29.         trigger_deprecation('contao/core-bundle''4.9''Using PageError404::generate() has been deprecated in Contao 4.9 and will be removed in Contao 5.0. Use the PageError404::getResponse() method instead.');
  30.         /** @var PageModel $objPage */
  31.         global $objPage;
  32.         $obj404 $this->prepare($page);
  33.         $objPage $obj404->loadDetails();
  34.         // Reset inherited cache timeouts (see #231)
  35.         if (!$objPage->includeCache)
  36.         {
  37.             $objPage->cache 0;
  38.             $objPage->clientCache 0;
  39.         }
  40.         /** @var PageRegular $objHandler */
  41.         $objHandler = new $GLOBALS['TL_PTY']['regular']();
  42.         header('HTTP/1.1 404 Not Found');
  43.         $objHandler->generate($objPage);
  44.     }
  45.     /**
  46.      * Return a response object
  47.      *
  48.      * @param PageModel|null $page
  49.      *
  50.      * @return Response
  51.      */
  52.     public function getResponse($page=null)
  53.     {
  54.         /** @var PageModel $objPage */
  55.         global $objPage;
  56.         $obj404 $this->prepare($page);
  57.         $objPage $obj404->loadDetails();
  58.         // Reset inherited cache timeouts (see #231)
  59.         if (!$objPage->includeCache)
  60.         {
  61.             $objPage->cache 0;
  62.             $objPage->clientCache 0;
  63.         }
  64.         /** @var PageRegular $objHandler */
  65.         $objHandler = new $GLOBALS['TL_PTY']['regular']();
  66.         return $objHandler->getResponse($objPage)->setStatusCode(404);
  67.     }
  68.     /**
  69.      * Prepare the output
  70.      *
  71.      * @param PageModel|null $page
  72.      *
  73.      * @return PageModel
  74.      *
  75.      * @internal Do not call this method in your code. It will be made private in Contao 5.0.
  76.      */
  77.     protected function prepare($page=null)
  78.     {
  79.         $obj404 null;
  80.         if ($page instanceof PageModel && $page->type === 'error_404')
  81.         {
  82.             // We don't actually need a root page, we just need the inherited properties to redirect a 404
  83.             $obj404 $objRootPage $page->loadDetails();
  84.         }
  85.         else
  86.         {
  87.             $objRootPage $this->getRootPageFromUrl();
  88.         }
  89.         // Forward if the language should be but is not set (see #4028)
  90.         if ($objRootPage->urlPrefix && System::getContainer()->getParameter('contao.legacy_routing'))
  91.         {
  92.             // Get the request string without the script name
  93.             $strRequest Environment::get('relativeRequest');
  94.             // Only redirect if there is no language fragment (see #4669)
  95.             if ($strRequest && !preg_match('@^[a-z]{2}(-[A-Z]{2})?/@'$strRequest))
  96.             {
  97.                 // Handle language fragments without trailing slash (see #7666)
  98.                 if (preg_match('@^[a-z]{2}(-[A-Z]{2})?$@'$strRequest))
  99.                 {
  100.                     $this->redirect(Environment::get('request') . '/'301);
  101.                 }
  102.                 else
  103.                 {
  104.                     if ($strRequest == Environment::get('request'))
  105.                     {
  106.                         $strRequest LocaleUtil::formatAsLanguageTag($objRootPage->language) . '/' $strRequest;
  107.                     }
  108.                     else
  109.                     {
  110.                         $strRequest Environment::get('script') . '/' LocaleUtil::formatAsLanguageTag($objRootPage->language) . '/' $strRequest;
  111.                     }
  112.                     $this->redirect($strRequest);
  113.                 }
  114.             }
  115.         }
  116.         // Look for a 404 page
  117.         if (null === $obj404)
  118.         {
  119.             $obj404 PageModel::find404ByPid($objRootPage->id);
  120.         }
  121.         // Die if there is no page at all
  122.         if (null === $obj404)
  123.         {
  124.             throw new PageNotFoundException('Page not found: ' Environment::get('uri'));
  125.         }
  126.         // Forward to another page
  127.         if ($obj404->autoforward && $obj404->jumpTo)
  128.         {
  129.             $objNextPage PageModel::findPublishedById($obj404->jumpTo);
  130.             if (null === $objNextPage)
  131.             {
  132.                 System::getContainer()->get('monolog.logger.contao.error')->error('Forward page ID "' $obj404->jumpTo '" does not exist');
  133.                 throw new ForwardPageNotFoundException('Forward page not found');
  134.             }
  135.             $this->redirect($objNextPage->getFrontendUrl());
  136.         }
  137.         return $obj404;
  138.     }
  139. }
  140. class_alias(PageError404::class, 'PageError404');