Puncte:0

Cum pot adăuga o redirecționare dinamică la o accesare 404?

drapel cn

Am creat un site și o adresă URL care returnează starea 404 Not Found www.xyz.com Acest lucru creează o pierdere a echității link-urilor către domeniu și are un impact negativ asupra capacității de a concura în rezultatele căutării organice.

Am vrut să redirecționez adresele URL care returnează o stare 404 la cea mai apropiată alternativă definită, sau la categoria părinte, pentru a revendica echitatea link-urilor de la domenii externe.

Exemplu: Să presupunem că folosesc URL-ul http://www.mysite.com/about/xyz/ și returnează 404, așa că am vrut să creez orice modul sau sistem care să redirecționeze inteligent către cea mai apropiată cale părinte, cum ar fi „http://www.mysite.com/about/”

Nu reușesc să găsesc nicio documentație specifică care să mă îndrume în direcția corectă.

Kevin avatar
drapel in
Căutați modulul 404?
manoj kumar Srivastaw avatar
drapel cn
@Kevin Mulțumesc pentru comentariul tău, de fapt, este o idee bună că am încercat acel modul, dar nu îmi îndeplinește cerințele exacte.
Puncte:1
drapel cg

Încercați să creați un abonat la eveniment personalizat. Dacă pagina este 404, luați adresa URL inițială și redirecționați în consecință.

Pentru a face acest lucru, creați un nou modul ("response_test" în acest exemplu), cu fișierele obișnuite .info.yml și .module.

Apoi înregistrează-ți abonatul evenimentului în fișierul de servicii al modulului... (vezi Exemplu de abonat eveniment pentru un exemplu complet.

./response_test.services.yml

Servicii:
    response_test.response_subscriber:
      clasa: Drupal\response_test\404RedirectResponseSubscriber
      Etichete:
        - { nume: event_subscriber }

Apoi creați o clasă pentru a gestiona evenimentul

./src/EventSubscriber/404RedirectResponseSubscriber.php

<?php 

namespace Drupal\response_test;

utilizați Symfony\Component\HttpKernel\Event\FilterResponseEvent;
utilizați Symfony\Component\HttpKernel\KernelEvents;
utilizați Symfony\Component\HttpKernel\HttpKernelInterface;
utilizați Symfony\Component\EventDispatcher\EventSubscriberInterface;
utilizați Symfony\Component\HttpFoundation\RedirectResponse;


clasa 404RedirectResponseSubscriber implementează EventSubscriberInterface {
  
  funcția publică onRespond(FilterResponseEvent $event) {
    dacă ($event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST) {
      întoarcere;
    }
    
    $răspuns = $eveniment->getResponse();
    dacă ($răspuns->getStatusCode() == 404) {

      // Ia cumva calea veche
      // @vedeți https://stackoverflow.com/q/11047305
      $oldPath = ''; // Încercați să utilizați $response->getUri() sau $response->headers->get('location')

      
      // Manipulați $oldPath pentru a elimina ultima parte
      // @vedeți https://stackoverflow.com/a/51573313/5771750
      $redirectPath = dirname($oldPath);

      $new_response = new RedirectResponse($redirectPath );

      // Pregătiți un nou Symfony\Component\HttpFoundation\Response și utilizați
      $event->setResponse($new_response);

    }
  }
  
  funcție publică statică getSubscribedEvents() {
    $events[KernelEvents::RESPONSE][] = array('onRespond');
    returnează $evenimente;
  }
  
}

Notă: Acest răspuns se bazează parțial pe răspunsul lui Clive de aici: https://drupal.stackexchange.com/a/86622

manoj kumar Srivastaw avatar
drapel cn
Mulțumesc @Chris :D foarte util pentru mine.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.