Попробуйте создать пользовательского подписчика событий. Если страница 404, возьмите исходный URL-адрес и перенаправьте его соответствующим образом.
Для этого создайте новый модуль (в данном примере «response_test») с обычными файлами .info.yml и .module.
Затем зарегистрируйте своего подписчика событий в файле сервисов модуля... (см. Пример EventSubscriber для полного примера.
./response_test.services.yml
Сервисы:
response_test.response_subscriber:
класс: Drupal\response_test\404RedirectResponseSubscriber
теги:
- {имя: event_subscriber}
Затем создайте класс для обработки события
./src/EventSubscriber/404RedirectResponseSubscriber.php
<?php
пространство имен Drupal\response_test;
используйте Symfony\Component\HttpKernel\Event\FilterResponseEvent;
используйте Symfony\Component\HttpKernel\KernelEvents;
используйте Symfony\Component\HttpKernel\HttpKernelInterface;
используйте Symfony\Component\EventDispatcher\EventSubscriberInterface;
используйте Symfony\Component\HttpFoundation\RedirectResponse;
class 404RedirectResponseSubscriber реализует EventSubscriberInterface {
публичная функция onRespond (FilterResponseEvent $event) {
если ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
возвращаться;
}
$ответ = $event->getResponse();
если ($ответ->getStatusCode() == 404) {
// Как-то получить старый путь
// @см. https://stackoverflow.com/q/11047305
$старыйПуть = ''; // Попробуйте использовать $response->getUri() или $response->headers->get('location')
// Манипуляции с $oldPath для удаления последней части
// @см. https://stackoverflow.com/a/51573313/5771750
$redirectPath = имя каталога ($ oldPath);
$new_response = новый RedirectResponse($redirectPath);
// Подготовить новый Symfony\Component\HttpFoundation\Response и использовать
$event->setResponse($new_response);
}
}
общедоступная статическая функция getSubscribedEvents() {
$events[KernelEvents::RESPONSE][] = array('onRespond');
вернуть $события;
}
}
Запись: этот ответ частично основан на ответе Клайва здесь: https://drupal.stackexchange.com/a/86622