Рейтинг:0

У меня есть пара пользовательских сущностей, определенных моим модулем для простых таблиц в моей базе данных (потому что у меня много данных и я не хочу распаковывать их все в поля).

флаг cn

www.xyz.com Это приводит к потере ссылочного веса домена и негативно влияет на способность конкурировать в обычных результатах поиска.Я хотел перенаправить URL-адреса, возвращающие статус 404, в определенную ближайшую альтернативу или родительскую категорию, чтобы восстановить ссылочный вес с внешних доменов.

Пример: предположим, я использую URL

http://www.mysite.com/about/xyz/ и он возвращает 404, поэтому я хотел создать любой модуль или систему, которые разумно перенаправляют на ближайший родительский путь, например"http://www.mysite.com/about/" Я не могу найти какую-либо конкретную документацию, которая указывала бы мне в правильном направлении.

Как я могу добавить динамическую переадресацию на хит 404?

Kevin avatar
флаг in
Поиск 404 модуля?
manoj kumar Srivastaw avatar
флаг cn
@Kevin Спасибо за ваш комментарий, на самом деле это хорошая идея, я попробовал этот модуль, но он не соответствует моему точному требованию.
Рейтинг:1
флаг cg

Попробуйте создать пользовательского подписчика событий. Если страница 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

manoj kumar Srivastaw avatar
флаг cn
Спасибо @Chris: D действительно полезно для меня.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.