Page promo image

Drupal 7: Views перехватывает несуществующий адрес

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

Например:
Есть дисплей Views, отображающий список новостей на сайте, доступный по адресу: "/news".
Есть страница новости (ноды), которая доступна по адресу-синониму: "/news/novost-1".

Пока существует нода новости, доступная по синониму "/news/novost-1", никаких проблем не возникает, и поисковики и пользователи видят все как положено. Но если вдруг по каким либо причинам мы удалим с сайта эту новость, ядро и соответствующие модули позаботятся о том чтоб удалился и синоним "/news/novost-1", сама новость пропадет из ленты и т.д. (после обновления кеша, если он используется), при этом если поисковики успели ее проиндексировать, то путь "/news/novost-1" они запомнят и придут по нему в следующий раз при обновлении индекса, а увидят они при всем при этом не 404-ю страницу ошибки, т.к. данной новости (страницы) на сайте более не существует, а первую страницу дисплея Views, доступного по адресу "/news". В результате, страница с адресом "/news/novost-1" будет жить в индексе поисковика, но что хуже всего теперь страницы "/news" и "/news/novost-1" будут считаться поисковиком как "клоны", ибо у них будет одинаковое содержимое, это не в лучшую сторону повлияет на позиции ваших страниц в поисковике при выдаче результатов поиска. При этом, если вы используете модуль Redirect, и не удаляете страницу а меняете ее адрес, модуль сам позаботится о том, чтоб пользователи (включая поисковики), которіе будут приходить на страницу по ее старому адресу, были перенаправлены на нее по новому адресу с 301-м редиректом.

Справедливости ради, хочется отметить, что если в подобном случае мы просто запросим у сайта страницу, например, по адресу "/news/blablabla" или даже "/news/blablabla/blablabla", то, как и в выше описанном случае, получим первую страницу дисплея Views, доступного по адресу "/news". Тот, кто занимается разработкой модулей для Drupal, поймет в чем именно причина такого поведения системы, соответственно, сказать что это ошибка или что, что-то работает неправильно, мы не можем, ибо такова идеология работы системы роутинга адресов в Drupal. В Drupal 8 такой проблемы, к стати, уже нет.

Для решения подобной ситуации есть модуль Views 404, но для 6-ки он не развился выше бетты, а под 7-ку до сих пор с 2013-го года находится в dev версии, хотя вроде как, даже работает, а с замечаниями пользователей по его работе, Вы можете ознакомится на соотв. странице модуля.

Дополнительные настройки дисплея Views для предотвращения перехвата несуществующих адресов и "отдачи" 404-й ошибки при доступе к ним

Но решить эту проблему можно и без помощи выше указанного модуля, благодаря дополнительным настройкам самого дисплея Views. Для этого необходимо немного настроить контекстные фильтры дисплея Views.

Вот что необходимо сделать (для универсальности пример настроек показан на англоязычном интерфейсе):

  1. Добавить в контекстные фильтры дисплея фильтр по NID материала (рис. 1).
    рис. 1. Добавляем контекстный фильтр по NID материала к дисплею Views
  2. Настроить добавляемый фильтр соотв. образом (рис. 2 и рис. 3):
    1. В разделе "WHEN THE FILTER VALUE IS NOT IN THE URL" выбираем пункт "Display all results for the specified field" - это позволит ман не нарушать привычную логику работы дисплея при достпе к нему по его алиасу.
      рис. 2. Параметры в разделе WHEN THE FILTER VALUE IS NOT IN THE URL настроек контекстного фильтра
    2. в разделе "WHEN THE FILTER VALUE IS IN THE URL OR A DEFAULT IS PROVIDED" выбираем чекбокс "Specify validation criteria", и устанавливаем такие значения следующих параметров:
      Validator => Content;
      Filter value format => Node ID;
      Action to take if filter value does not validate => Show "Page not found"
      рис. 3. Настройки контекстного фильтра в разделе WHEN THE FILTER VALUE IS IN THE URL OR A DEFAULT IS PROVIDED
  3. Применяем указанные настройки.
  4. Сохраняем представление.

Если Вам необходимо таким образом настроить дисплей Views, который отбирает не ноды а, например, термины таксономии, то добавлять фильтр надо по ID термина таксономии (Taxonomy term: Term ID), а значения из п. 2.2 должны быть такими (рис. 4):

Validator => Taxonomy term;
Filter value format => Term ID;
Action to take if filter value does not validate => Show "Page not found"

рис. 4. Настройки контекстного фильтра в разделе WHEN THE FILTER VALUE IS IN THE URL OR A DEFAULT IS PROVIDED при отборе терминов таксономии
comments powered by Disqus