Не происходит редирект на 404

Главные вкладки

Аватар пользователя dictor dictor 31 октября 2018 в 19:34

Всем доброго времени суток. Тапками не бить и помидорами гнилыми не кидать. Уверенн что решение уже есть ( Истина гдето там ), но я его найти так и не смог.
Проблема, собственно, заключается вот в чем: есть на друпале страница 404. В основных настройках указан к ней путь в поле "Страница по умолчанию для ошибки 404 (не найдено)". При введении неправильного урла ( например http://domain/абракадабра) страница отображается, но при этом в адресной строке не меняется урл (на, допустим, http://domain/404), а остается тот что был введен ( http://domain/абракадабра ). Как это исправить?

Пробовал делать редирект вручную с того адреса который указан в настройках "Страница по умолчанию для ошибки 404 (не найдено)" на какой ни будь другой - адрес меняется только в случае, если в адресную строку ввести конкретно тот который указан в настройках "Страница по умолчанию для ошибки 404 (не найдено)". Для останых - не происходит редиректа.

Комментарии

Аватар пользователя dictor dictor 31 октября 2018 в 19:56

Такую задачу поставил работодатель:

При переходе на несуществующую страницу https://domain/dsfsdfsfa
должен выполнится 301 редирект на страницу https://domain/404 у которой должен быть код ответа 404

ПЫ. СЫ. Мне не положено знать назначение таких манипуляций

Аватар пользователя dictor dictor 31 октября 2018 в 20:01

В основных настройках сайта указал в поле "Страница по умолчанию для ошибки 404 (не найдено)" адрес страницы ошибки. В низу мелким шрифтом написано "Введите путь, на который будет выполняться перенаправление при возникновении 404-ой ошибки (страница не найдена)." При введении кривого урла - показывается 404 страница, но при этом в адресной строке урл остается кривой, не меняется на урл страницы 404

Аватар пользователя dictor dictor 31 октября 2018 в 20:09

Пробовал указать в основных настройках несуществующий урл, а потом редиректить этот урл через URL redirects на 404
При этом - не происходило вообще ничего. Показывало просто пустую страницу без контента, только с хедером и футером и адрес не менялся никак

Аватар пользователя bumble bumble 31 октября 2018 в 20:11

Интересно, что Вы ожидали увидеть указывая несуществующую страницу...

Вам нужно программно отловить 404ю и перенаправить физически на нужный урл.

Аватар пользователя dictor dictor 31 октября 2018 в 20:14

Интересно, что Вы ожидали увидеть указывая несуществующую страницу...


Знаю что глупо, но просто уже не мог придумать как иначе сделать

Вам нужно программно отловить 404ю и перенаправить физически на нужный урл.

как это делается, не подскажите? Просто с друпалом первый раз столкнулся. Вообще занимаюсь фронтэндом, но заставили колупаться в ЦМС

Аватар пользователя bumble bumble 31 октября 2018 в 22:36
1

В своем модуле, добавьте подписку на событие:

/mymodule.services.yml

services:
  mymodule.event_subscriber:
    class: Drupal\mymodule\EventSubscriber\Custom404Subscriber
    tags:
    - {name: event_subscriber}

/src/EventSubscriber/Custom404Subscriber.php


<?php
 
namespace Drupal\mymodule\EventSubscriber;
 
use 
Symfony\Component\HttpFoundation\RedirectResponse;
use 
Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use 
Symfony\Component\HttpKernel\KernelEvents;
use 
Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
class 
Custom404Subscriber implements EventSubscriberInterface {
    public static function 
getSubscribedEvents() {
        
$events[KernelEvents::RESPONSE][] = 'redirectTo404';
        return 
$events;
    }
 
    public function 
redirectTo404(FilterResponseEvent $event) {
        
$to '/404';
        
$statusCode $event->getResponse()->getStatusCode();
        
$path = \Drupal::service('path.current')->getPath();
        if (
$statusCode == 404 && $to != $path) {
            
$event->setResponse(new RedirectResponse($to));
        }
    }
}
?>
Аватар пользователя dictor dictor 1 ноября 2018 в 11:55

А если я не разрабатываю свой модуль? Можно как то сделать через хук function themeName_preprocess_page() ?
Потому что я не совсем понимаю куда приведенный выше код писать.

upd: Сутки гугления привели к такому умозаключению: в этом методе (themeName_preprocess_page() ) я смогу узнать произошла ли 404 ошибка посмотрев хидеры ответа "drupal_get_http_header("status");" но, как оказалось - это актуально только для 7-й версии, а в 8-й больше нет таких методов и чтобы получить значение хидера нужно его вылавливать через HttpFoundation компонент Симфони. Какая есть альтернатива для 8-й версии?

Аватар пользователя dictor dictor 1 ноября 2018 в 17:00

Вобщем то - огромное спасибо. Создал свой модуль, в него поместил вами предоставленный код и подключил. Все работает.

Аватар пользователя pselfin pselfin 1 ноября 2018 в 15:04
3

Плохое тз...
Что отдается код 404 - это правильно, это нужно.
Показывается нужная вам страница? Оформлена как нужно, описано что нужно? ОК!

А вот менять урл - я б крепко про это подумал... ибо по урлу посетитель может догадаться/понять в каком разделе была страница, куда примерно пойти. Конечно не все такие хитрые, но какая-то часть посетителей сообразит.

А вообще какой смысл редиректить на 404? Правильно такие битые ссылки редиректить на новые соответствующие страницы. Для этого модуль Redirect (или ранее Global Redirect).

Аватар пользователя dictor dictor 5 ноября 2018 в 14:43

Короче, суть в том, чтобы перенаправлять битые ссылки на 404, для того, чтобы гугля не индексировал 100500 страниц с неправильными линками.

Аватар пользователя bumble bumble 5 ноября 2018 в 14:47

Т.е. Вы хотите скормить гуглу 404ю??
Правильный выход - исправить все "битые ссылки".
Для перемещенных - редирект должен быть 302й, а не "Страницу не найдено".

Аватар пользователя gun_dose gun_dose 5 ноября 2018 в 15:07
1

Нельзя перенаправлять на 404. Это вообще несусветная глупость. По всем несуществующим урлам должно отдаваться 404 без переадресации. А 301 редирект нужен для страниц, у которых по каким-то причинам сменился урл, например при переезде со старого сайта на новый.