Всем доброго времени суток. Тапками не бить и помидорами гнилыми не кидать. Уверенн что решение уже есть ( Истина гдето там ), но я его найти так и не смог.
Проблема, собственно, заключается вот в чем: есть на друпале страница 404. В основных настройках указан к ней путь в поле "Страница по умолчанию для ошибки 404 (не найдено)". При введении неправильного урла ( например http://domain/абракадабра) страница отображается, но при этом в адресной строке не меняется урл (на, допустим, http://domain/404), а остается тот что был введен ( http://domain/абракадабра ). Как это исправить?
Пробовал делать редирект вручную с того адреса который указан в настройках "Страница по умолчанию для ошибки 404 (не найдено)" на какой ни будь другой - адрес меняется только в случае, если в адресную строку ввести конкретно тот который указан в настройках "Страница по умолчанию для ошибки 404 (не найдено)". Для останых - не происходит редиректа.
Комментарии
Зачем?
Это не проблема, и уж тем более не ошибка.
Такую задачу поставил работодатель:
ПЫ. СЫ. Мне не положено знать назначение таких манипуляций
Ок. С чем конкретно у Вас проблема? Какими средствами перенаправляете?
В основных настройках сайта указал в поле "Страница по умолчанию для ошибки 404 (не найдено)" адрес страницы ошибки. В низу мелким шрифтом написано "Введите путь, на который будет выполняться перенаправление при возникновении 404-ой ошибки (страница не найдена)." При введении кривого урла - показывается 404 страница, но при этом в адресной строке урл остается кривой, не меняется на урл страницы 404
я об этом
Пробовал указать в основных настройках несуществующий урл, а потом редиректить этот урл через URL redirects на 404
При этом - не происходило вообще ничего. Показывало просто пустую страницу без контента, только с хедером и футером и адрес не менялся никак
Интересно, что Вы ожидали увидеть указывая несуществующую страницу...Вам нужно программно отловить 404ю и перенаправить физически на нужный урл.
Знаю что глупо, но просто уже не мог придумать как иначе сделать
как это делается, не подскажите? Просто с друпалом первый раз столкнулся. Вообще занимаюсь фронтэндом, но заставили колупаться в ЦМС
В своем модуле, добавьте подписку на событие:
/mymodule.services.yml
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));
}
}
}
?>
А если я не разрабатываю свой модуль? Можно как то сделать через хук function themeName_preprocess_page() ?
Потому что я не совсем понимаю куда приведенный выше код писать.
upd: Сутки гугления привели к такому умозаключению: в этом методе (themeName_preprocess_page() ) я смогу узнать произошла ли 404 ошибка посмотрев хидеры ответа "drupal_get_http_header("status");" но, как оказалось - это актуально только для 7-й версии, а в 8-й больше нет таких методов и чтобы получить значение хидера нужно его вылавливать через HttpFoundation компонент Симфони. Какая есть альтернатива для 8-й версии?
Вобщем то - огромное спасибо. Создал свой модуль, в него поместил вами предоставленный код и подключил. Все работает.
Страница 404 имеет адрес "node/32" и синоним - "404". Если в строку вбить http://domain/node/32 - он редиректится на http://domain/404. Все остальное - просто показывает 404 стрницу, но адрес не меняет
Адрес и не должен меняться.
ТЗ такое. Я должен сделать чтобы менялся
Плохое тз...
Что отдается код 404 - это правильно, это нужно.
Показывается нужная вам страница? Оформлена как нужно, описано что нужно? ОК!
А вот менять урл - я б крепко про это подумал... ибо по урлу посетитель может догадаться/понять в каком разделе была страница, куда примерно пойти. Конечно не все такие хитрые, но какая-то часть посетителей сообразит.
А вообще какой смысл редиректить на 404? Правильно такие битые ссылки редиректить на новые соответствующие страницы. Для этого модуль Redirect (или ранее Global Redirect).
Короче, суть в том, чтобы перенаправлять битые ссылки на 404, для того, чтобы гугля не индексировал 100500 страниц с неправильными линками.
Т.е. Вы хотите скормить гуглу 404ю??
Правильный выход - исправить все "битые ссылки".
Для перемещенных - редирект должен быть 302й, а не "Страницу не найдено".
Нельзя перенаправлять на 404. Это вообще несусветная глупость. По всем несуществующим урлам должно отдаваться 404 без переадресации. А 301 редирект нужен для страниц, у которых по каким-то причинам сменился урл, например при переезде со старого сайта на новый.