[PHP] TYPO3 Log Einträge "The page is not configured! [type=...][]" vermeiden

[PHP] TYPO3 Log Einträge "The page is not configured! [type=...][]" vermeiden

Wenn ihr im Log im Backend oftmals Einträge findet, die darauf zurückzuführen sind, dass irgendwelche Besucher eurer Website einen nicht existierenden TypeNum aufrufen, dann haben wir vielleicht das richtige Snippet für euch.

Blog Post aktualisiert am 11.4.2024

Kennt ihr das auch? Ihr habt schon lange keinen TypeNum 98, 99, 100 oder 3135 mehr in eurer Konfiguration der Website und dennoch gibt es immer noch solche Requests auf eure Seite. Diese führen dann zu einer Fehlermeldung und einem Status 500. Noch schlimmer ist es, wenn irgendwelche Hackingscripts den TypeNum mit SQL-Queries zumüllen und dies dann sogar in den Cache von TYPO3 wandert. Dann sehen die internen Links z.B. so aus:

domain.org/page1/?type=UNION%20SELECT%20FROM%20...

Wenn ihr nicht alle diese Types in der .htaccess blocken wollt, könnt ihr euch auch über PSR-15 Middleware bereits relativ früh ins System hängen und den angeforderten Type mit den Type-Settings in der Site Konfiguration abgleichen. Im nachfolgenden Beispiel schmeißen wir eine 404 Meldung.

EXT:sitepackage/Configuration/RequestMiddlewares.php:

<?php return [ 'frontend' => [ 'sitepackage-undefinedtypenumerrorhandling' => [ 'target' => \In2code\In2template\Middleware\UndefinedTypeNumErrorHandling::class, 'before' => [ 'typo3/cms-redirects/redirecthandler' ], 'after' => [ 'typo3/cms-frontend/site', ] ] ] ];

EXT:sitepackage/Classes/Middleware/UndefinedTypeNumErrorHandling.php:

<?php declare(strict_types=1); namespace In2code\In2template\Middleware; use In2code\In2template\Exception\ConfigurationMissingException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use Throwable; use TYPO3\CMS\Core\Site\Entity\Site; use TYPO3\CMS\Core\Utility\MathUtility; /** * Class UndefinedTypeNumErrorHandling * to simply show 404 page if a typeNum is given, that is not defined in siteconfiguration. * This avoids annoying log entries and delivers a 404 to the (e.g.) bot that is calling the outdated url. */ class UndefinedTypeNumErrorHandling implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { if ($this->isTypeNumSet($request) && $this->isTypeNumAllowed($request) === false) { /** @var Site $site */ $site = $request->getAttribute('site'); try { $errorHandler = $site->getErrorHandler(404); return $errorHandler->handlePageError($request, 'Given type is not registered in site configuration'); } catch (Throwable $exception) { throw new ConfigurationMissingException('No 404 error handler given in site configuration', 1643989065); } } return $handler->handle($request); } protected function isTypeNumSet(ServerRequestInterface $request): bool { return array_key_exists('type', $request->getQueryParams()); } protected function isTypeNumAllowed(ServerRequestInterface $request): bool { /** @var Site $site */ $site = $request->getAttribute('site'); if ( $site !== null && is_a($site, NullSite::class) === false && !empty($site->getConfiguration()['routeEnhancers']['PageTypeSuffix']['map']) ) { $allowedTypeNums = array_values($site->getConfiguration()['routeEnhancers']['PageTypeSuffix']['map']); $type = $request->getQueryParams()['type']; if (MathUtility::canBeInterpretedAsInteger($type)) { return in_array((int)$type, $allowedTypeNums, true); } } return false; } }

Hinweis: Wenn ihr dieses oder ein ähnliches Snippet verwendet, müsst ihr darauf achten, dass alle eure TypeNum-Definitionen auch in der Site-Configuration aufgenommen wurde - z.B.:

rootPageId: 1 routes: - route: robots.txt type: staticText content: "Disallow: /typo3/\r\n" routeEnhancers: PageTypeSuffix: type: PageType default: / index: '' suffix: / map: print.html: 99 preview.html: 1560777975 newsletter.html: 1562349004 pixel.png: 1561894816

Weiterleitung statt 404

Hier mal ein Beispiel, wenn ihr lieber eine 302-Weiterleitung auf die gleiche Seite ohne GET-Parameter haben wollt, an Stelle einer 404-Meldung:

<?php declare(strict_types=1); namespace In2code\In2template\Middleware; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\UriInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use TYPO3\CMS\Core\Http\RedirectResponse; use TYPO3\CMS\Core\Site\Entity\NullSite; use TYPO3\CMS\Core\Site\Entity\Site; use TYPO3\CMS\Core\Utility\MathUtility; /** * Class UndefinedTypeNumErrorHandling * to simply redirect to same page if a typeNum is given, that is not defined in site configuration. */ class UndefinedTypeNumErrorHandling implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { if ($this->isTypeNumSet($request) && $this->isTypeNumAllowed($request) === false) { return new RedirectResponse($this->getRedirectUri($request)); } return $handler->handle($request); } /** * Clone current URI and remove GET parameters and anchors * * @param ServerRequestInterface $request * @return UriInterface */ protected function getRedirectUri(ServerRequestInterface $request): UriInterface { $uri = (clone $request->getUri()) ->withQuery('') ->withScheme(''); return $uri; } protected function isTypeNumSet(ServerRequestInterface $request): bool { return array_key_exists('type', $request->getQueryParams()); } protected function isTypeNumAllowed(ServerRequestInterface $request): bool { /** @var Site $site */ $site = $request->getAttribute('site'); if ( $site !== null && is_a($site, NullSite::class) === false && !empty($site->getConfiguration()['routeEnhancers']['PageTypeSuffix']['map']) ) { $allowedTypeNums = array_values($site->getConfiguration()['routeEnhancers']['PageTypeSuffix']['map']); $type = $request->getQueryParams()['type']; if (MathUtility::canBeInterpretedAsInteger($type)) { return in_array((int)$type, $allowedTypeNums, true); } } return false; } }

TYPO3: Unbenutzte Dateien im fileadmin finden

Ihr wollt unbenutzte oder verwaiste Dateien im fileadmin oder einer anderen Storage löschen? Leider gibt es hier nichts direkt vom Core. Aber ein kleiner Command in eurem Sitepackage hilft schnell...

Zum Beitrag

TYPO3: Redakteure mit individuellen user_upload Folder

Vielleicht kennt ihr die Kundenanforderung? Redakteure sollen Videos über den Button "Add media by URL" hinzufügen können. Aber die Dateien sollen sich dann nicht in fileadmin/user_upload/ sondern in...

Zum Beitrag

TYPO3: Seiten im Mixed Mode finden

Mixed Mode bezeichnet man in TYPO3 übersetzte Seiten, auf denen sich Seiteninhalte befinden, die nur zum Teil eine Relation auf entsprechende Seiteninhalte in der Hauptsprache haben. Dies wird im...

Zum Beitrag

Extbase Extensions: An Erweiterbarkeit denken mit data, site und language

Heute mal eine kleine Bitte an die TYPO3-Extension-Autoren da draußen: Achtet auf Erweiterbarkeit eurer Extensions. Dies fördert dann auch die Verbreitung der entsprechenden Plugins.

Zum Beitrag

SQL: Zeige alle Tabellen absteigend nach Größe sortiert

Ich brauche in letzter Zeit häufiger den SQL-Befehl, um herauszufinden, welche Tabellen in der TYPO3-Datenbank am größten sind. Ich habe das Snippet einmal veröffentlicht.

Zum Beitrag

TYPO3 12 mit CKEditor 5: Stile als Einfachauswahl

Wenn man im RTE in TYPO3 einen Link setzt, kann es sein, dass man zwischen verschiedenen Link-Klassen auswählen muss, um beispielsweise Buttons im Frontend zu erzeugen. Neu ist in TYPO3 12 dass man...

Zum Beitrag