Я использую механизм 404 symfony2, который в основном работает нормально.
Вот сценарий. Скажите, что вы заходите на сайт www.site.tld / whatever – где / чего не существует. После того, как вы перейдете на страницу, URL останется www.site.tld / whatever – но 404 страница возвращается фреймворком.
Как я могу заставить КАЖДЫЙ 404 к общему маршруту, например, www.site.tld / not-found, чтобы исходный запрошенный маршрут НЕ оставался в URL-адресе BAR?
Принятый ответ на это кажется немного взломанным, хотя он явно работает, хотя похоже, что он даст код статуса 301, а не 404.
Другим подходом было бы использование прослушивателя событий для прослушивания NotFoundHttpException
например.
use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; class NotFound404Listener { protected $router; public function __construct(UrlGeneratorInterface $router) { $this->router = $router; } public function onKernelException(GetResponseForExceptionEvent $event) { if ($event->getException() instanceof NotFoundHttpException) { $url = $this->router->generateUrl(/** your route **/); $response = new RedirectResponse($url, 404); // Set redirect response to url of route with a 404 header $event->setResponse($response); } } }
с услугой (YAML) ..
not.found.404.listener: class: %not.found.404.listsner.class% arguments: - @router tags: - { name: kernel.event_listener, event: kernel.exception, method: onKernelException }
Я использую это для перенаправления всех несуществующих маршрутов:
anything: path: /{mypath} defaults: _controller: FrameworkBundle:Redirect:urlRedirect path: / #change this to whatever path permanent: true requirements: mypath: ".+"
поanything: path: /{mypath} defaults: _controller: FrameworkBundle:Redirect:urlRedirect path: / #change this to whatever path permanent: true requirements: mypath: ".+"
Я положил его на дно после всего существующего маршрута приложения.