Router a chyba 404 u souborů s příponou
- d@rkWolf
- Člen | 167
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
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…
- David Matějka
- Moderator | 6445
uprav si logiku v ErrorPresenteru, aby to forwardovalo na ten spravny
- d@rkWolf
- Člen | 167
@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
$module
po splitName imho vrátí kompletní cestu modulů,
proto to pak hledá ten error presenter v sub modulech