Score:0

ฉันจะเพิ่มการเปลี่ยนเส้นทางแบบไดนามิกในการเข้าชม 404 ได้อย่างไร

ธง cn

ฉันสร้างไซต์และ URL ที่ส่งคืนสถานะ 404 ไม่พบ www.xyz.com สิ่งนี้สร้างการสูญเสียส่วนของลิงก์ไปยังโดเมนและส่งผลเสียต่อความสามารถในการแข่งขันในผลการค้นหาทั่วไป

ฉันต้องการเปลี่ยนเส้นทาง URL ที่ส่งคืนสถานะ 404 ไปยังทางเลือกที่ใกล้เคียงที่สุดที่กำหนดไว้ หรือหมวดหมู่หลัก เพื่อเรียกคืนส่วนของลิงก์จากโดเมนภายนอก

ตัวอย่าง: สมมติว่าฉันใช้ URL http://www.mysite.com/about/xyz/ และส่งคืน 404 ดังนั้นฉันจึงต้องการสร้างโมดูลหรือระบบใดๆ ที่เปลี่ยนเส้นทางไปยังเส้นทางพาเรนต์ที่ใกล้ที่สุดอย่างชาญฉลาด เช่น "http://www.mysite.com/about/"

ฉันไม่พบเอกสารเฉพาะที่จะชี้ให้ฉันไปในทิศทางที่ถูกต้อง

Kevin avatar
in flag
ค้นหาโมดูล 404?
manoj kumar Srivastaw avatar
cn flag
@Kevin ขอบคุณสำหรับความคิดเห็นของคุณ จริง ๆ แล้วมันเป็นความคิดที่ดีที่ฉันลองใช้โมดูลนั้น แต่ไม่เป็นไปตามข้อกำหนดที่แน่นอนของฉัน
Score:1
ธง cg

ลองสร้างสมาชิกเหตุการณ์ที่กำหนดเอง หากหน้านั้นเป็น 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

manoj kumar Srivastaw avatar
cn flag
ขอบคุณ @Chris :D มีประโยชน์มากสำหรับฉัน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา