Hãy thử tạo một người đăng ký sự kiện tùy chỉnh. Nếu trang là 404, hãy lấy URL gốc và chuyển hướng tương ứng.
Để làm như vậy, hãy tạo một mô-đun mới (trong ví dụ này là "response_test"), với tệp .info.yml và .module thông thường.
Sau đó đăng ký người đăng ký sự kiện của bạn trong tệp dịch vụ của mô-đun... (xem Ví dụ về người đăng ký sự kiện cho một ví dụ đầy đủ.
./response_test.services.yml
dịch vụ:
response_test.response_subscriber:
lớp: Drupal\response_test\404RedirectResponseSubscriber
thẻ:
- { tên: event_subscriber }
Sau đó tạo một lớp để xử lý sự kiện
./src/EventSubscriber/404RedirectResponseSubscriber.php
<?php
không gian tên Drupal\response_test;
sử dụng Symfony\Component\HttpKernel\Event\FilterResponseEvent;
sử dụng Symfony\Thành phần\HttpKernel\KernelEvents;
sử dụng Symfony\Thành phần\HttpKernel\HttpKernelInterface;
sử dụng Symfony\Component\EventDispatcher\EventSubscriberInterface;
sử dụng Symfony\Thành phần\HttpFoundation\RedirectResponse;
lớp 404RedirectResponseSubscriber triển khai EventSubscriberInterface {
hàm công khai onRespond(FilterResponseEvent $event) {
if ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
trở lại;
}
$response = $event->getResponse();
if ($response->getStatusCode() == 404) {
// Lấy đường dẫn cũ bằng cách nào đó
// @xem https://stackoverflow.com/q/11047305
$oldPath = ''; // Hãy thử sử dụng $response->getUri() hoặc $response->headers->get('location')
// Thao tác với $oldPath để loại bỏ phần cuối cùng
// @xem https://stackoverflow.com/a/51573313/5771750
$redirectPath = dirname($oldPath);
$new_response = new RedirectResponse($redirectPath );
// Chuẩn bị một Symfony\Component\HttpFoundation\Response mới và sử dụng
$event->setResponse($new_response);
}
}
hàm tĩnh công khai getSubscribeEvents() {
$events[KernelEvents::RESPONSE][] = array('onRespond');
trả lại sự kiện $;
}
}
Ghi chú: Câu trả lời này một phần dựa trên câu trả lời của Clive tại đây: https://drupal.stackexchange.com/a/86622