ลองสร้างสมาชิกเหตุการณ์ที่กำหนดเอง หากหน้านั้นเป็น 404 ให้คว้า URL เดิมและเปลี่ยนเส้นทางตามนั้น
ในการทำเช่นนั้น ให้สร้างโมดูลใหม่ ("response_test" ในตัวอย่างนี้) ด้วยไฟล์ .info.yml และ .module ตามปกติ
จากนั้นลงทะเบียนสมาชิกเหตุการณ์ของคุณในไฟล์บริการของโมดูล... (ดู ตัวอย่างสมาชิกเหตุการณ์ สำหรับตัวอย่างแบบเต็ม
./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) {
กลับ;
}
$response = $event->getResponse();
ถ้า ($response->getStatusCode() == 404) {
// รับเส้นทางเก่าอย่างใด
// @ดู https://stackoverflow.com/q/11047305
$oldPath = ''; // ลองใช้ $response->getUri() หรือ $response->headers->get('location')
// จัดการ $oldPath เพื่อลบส่วนสุดท้าย
// @ดู https://stackoverflow.com/a/51573313/5771750
$redirectPath = dirname($oldPath);
$new_response = ใหม่ RedirectResponse($redirectPath );
// เตรียม Symfony\Component\HttpFoundation\Response ใหม่และใช้งาน
$event->setResponse($new_response);
}
}
ฟังก์ชั่นคงที่สาธารณะ getSubscribedEvents () {
$events[KernelEvents::RESPONSE][] = array('onRespond');
ส่งคืนเหตุการณ์ $;
}
}
บันทึก: คำตอบนี้บางส่วนมาจากคำตอบของ Clive ที่นี่: https://drupal.stackexchange.com/a/86622