Điểm:0

Làm cách nào tôi có thể thêm chuyển hướng động trên lần truy cập 404?

lá cờ cn

Tôi đã tạo một trang web và URL trả về trạng thái 404 Không tìm thấy trên www.xyz.com Điều này tạo ra sự mất mát liên kết vốn chủ sở hữu cho tên miền và tác động tiêu cực đến khả năng cạnh tranh trong kết quả tìm kiếm không phải trả tiền.

Tôi muốn Chuyển hướng các URL trả lại trạng thái 404 sang danh mục gốc hoặc danh mục thay thế gần nhất đã xác định để lấy lại giá trị liên kết từ các miền bên ngoài.

Ví dụ: Giả sử tôi đang sử dụng URL http://www.mysite.com/about/xyz/ và nó trả về 404 vì vậy tôi muốn tạo bất kỳ mô-đun hoặc hệ thống nào chuyển hướng thông minh đến đường dẫn gốc gần nhất như "http://www.mysite.com/about/"

Tôi không thể tìm thấy bất kỳ tài liệu cụ thể nào có thể chỉ cho tôi đi đúng hướng.

Kevin avatar
lá cờ in
Tìm kiếm mô-đun 404?
manoj kumar Srivastaw avatar
lá cờ cn
@Kevin Cảm ơn nhận xét của bạn thực sự đó là một ý tưởng hay. Tôi đã thử mô-đun đó nhưng nó không đáp ứng yêu cầu Chính xác của tôi.
Điểm:1
lá cờ cg

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

manoj kumar Srivastaw avatar
lá cờ cn
Cảm ơn @Chris: D thực sự hữu ích cho tôi.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.