Router a chyba 404 u souborů s příponou

d@rkWolf
Člen | 167
+
0
-

Zdravím, chodí mi na web požadavky na spoustu různých souborů s příponou, které mi končí naroutované na nějaké submoduly-viz např.:

/sitemap.xml.gz

[2020–08–31 06–51–40] Nette\Application\InvalidPresenterException: Cannot load presenter ‚Front:Sitemap:Xml:Error4xx‘, class ‚App\FrontModule\SitemapModule\XmlModule\Presenters\Error4xxPresenter‘ was not found.

/default.asp

[2020–08–31 06–51–40] Nette\Application\InvalidPresenterException: Cannot load presenter ‚Front:Sitemap:Xml:Error4xx‘, class ‚App\FrontModule\SitemapModule\XmlModule\Presenters\Error4xxPresenter‘ was not found.

/sitemaps.xml

[2020–08–31 07–34–28] Nette\Application\InvalidPresenterException: Cannot load presenter ‚Front:Sitemaps:Error4xx‘, class ‚App\FrontModule\SitemapsModule\Presenters\Error4xxPresenter‘ was not found.

Web má moduly Front a Admin, všechny tyhle dotazy by měly končit na Front:Error4xx, ale nemám tušení, jak to zařídit. V případě, že adresu zavolám bez přípony, funguje to správně, přípona způsobí, že se celé routování posune na neexistující submodul.

Jako poslední default routu mám tohle:

        $router = new RouteList;

        $router->withModule('Front')
               ->addRoute('[<locale=en en|cs>/][<presenter>[/<action>[/<id>]]][.html][.php]', [
                   'locale'    => 'en',
                   'presenter' => 'Homepage',
                   'action'    => 'default',
                   'id'        => null,
               ])
            ->end();

        return $router;

Měl sem problém i s příchozími požadavky na .html nebo .php, tak jsem tam přidal to v závorce na konci, ale vypisovat tam všechny existující přípony předpokládám asi není správné řešení? Dá se to nějak vyřešit, je to na nějaký obecný způsob? Nebo to nějak rušíte v htaccess, aby to soubory s různými příponami vůbec nesměrovalo na index?

Editoval d@rkWolf (31. 8. 2020 11:52)

d@rkWolf
Člen | 167
+
0
-

Vážně nikdo?? To necháváte generovat weby mraky 500vek na veškeré dotazy, co se nechytí na specifické routy místo, aby to odpovídalo 404? Generuje mi to desítky až stovky chybových reportů měsíčně, chybových reportů úplně zbytečných a nesmyslných.

Nebo to mám sledovat v tom logu a veškeré ty přípony připisovat do htaccessu, aby se neposílaly na index? mě osobně přijde lepší na to vracet 404. Ale jako fakt nevím…

CZechBoY
Člen | 3608
+
+1
-

Máš špatně nastavený ErrorPresenter nebo chybí ten co tam nastavený máš.

David Matějka
Moderator | 6445
+
+1
-

uprav si logiku v ErrorPresenteru, aby to forwardovalo na ten spravny

d@rkWolf
Člen | 167
+
0
-

@DavidMatějka mno mám v errorPresenteru tohle:

<?php
    public function run(Nette\Application\Request $request): Nette\Application\IResponse
    {
        $exception = $request->getParameter('exception');

        if ($exception instanceof Nette\Application\BadRequestException) {
            // $this->logger->log("HTTP code {$e->getCode()}: {$e->getMessage()} in {$e->getFile()}:{$e->getLine()}", 'access');
            $presenterName = $request->getParameter('request') ? $request->getParameter('request')->getPresenterName() : $request->getPresenterName();
            [$module, , $sep] = Nette\Application\Helpers::splitName($presenterName);
            if (empty($module)) {
                $module = 'Front:';
            }

            return new Responses\ForwardResponse($request->setPresenterName($module . $sep . 'Error4xx'));
        }

        $this->logger->log($exception, ILogger::EXCEPTION);

        return new Responses\CallbackResponse(function (Http\IRequest $httpRequest, Http\IResponse $httpResponse): void {
            if (preg_match('#^text/html(?:;|$)#', (string)$httpResponse->getHeader('Content-Type'))) {
                require __DIR__ . '/templates/Error/500.phtml';
            }
        });
    }
?>

Potřebuju, aby to v Admin modulu poslalo na AdminModule/Error4xxPresenter a u všeho ostatního na FrontModule/Error4xxPresenter, pokud se jedná o 4xx chybu, pokud se ten modul nenadetekuje, tak ho nastavuju napevno na Front. Ale jinak popravdě netuším, proč to pak udělá těch několik dalších submodule zanoření a tam to hledá to 4xx.

Musím říct, že mě ty errorPresentery neskutečně štvou…fórum je plný dotazů na tohle téma, prohledal sem toho tuny a nikde žádný smysluplný vysvětlení, jak na to. Jak by se to množství dotazů na tohle téma zredukovalo, kdyby to např. bylo součástí toho modulovýho example co je na gitu, která je bohužel tak smutně barebone, že je úplně k ničemu. Error presenter v ní pro jistotu ani není, žádnej.

Editoval d@rkWolf (2. 11. 2020 11:43)

David Matějka
Moderator | 6445
+
0
-

$module po splitName imho vrátí kompletní cestu modulů, proto to pak hledá ten error presenter v sub modulech

d@rkWolf
Člen | 167
+
0
-

@DavidMatějka což je hádám kvůli tomu, že moduly můžou být různě zanořený? takže řešení je vydefinovat si pozice, kde sou 4xx presentery, hledat to v tom stringu a switchem nebo něčím posílat jen na dané moduly?