Сделать 404-ый ответ сервера на определенные страницы

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

Аватар пользователя tulvit tulvit 31 октября 2009 в 20:49

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

Есть словарь вида
razdel1
razdel2
razdel3

Прописаны такие синонимы адресов для всех разделов этого словаря:
category/razdel1/voc
category/razdel2/voc
category/razsel3/voc

Т.к. стандартный вывод списков нод меня не устраивал, создал во вьюс странички, выводящие список нод по терминам, адреса страниц такие:

categore/razdel1
category/razdel2
category/razdel3

Соответственно адрес материала получается такой category/razdel1/voc/node-title

И вот таким образом образовались лишние страницы и дубли, при обращении к которым хотелось бы получить "Страница не найдена".

1. При обращении к несуществующему материалу по адресу сategory/razdel1/bla-bla-bla грузится сategory/razdel1/ и ответ сервера 200, хотя нужен 404. Ситуация еще неприятна тем, что раньше на домене весел сайт со схожей структурой с кучей материалов с такого рода адресами, сейчас получается, что эти адреса остались работоспособными и породили сотни дублей. Такое ощущение, что проблема решается парой кликов в модуле вьюс/при несуществующем адресе отдавать 404, а не страницу/, но что надо сделать так и не додумался.

2. Адреса материалов у меня category/razdel1/voc/title-node, соответственно по адресу category/razdel1/voc мы получаем список всех нод, принадлежащих этому термину. А т.к. список нод я вывожу отдельно через вьюс, то опять таки получаются дубли. Нужно запретить доступ к просмотру списков нод, принадлежащих определённым терминам словаря, при этом не затронув доступ к сами нодам. Наверняка же есть какая-то стандартная друпаловская фича для этого.

Комментарии

Аватар пользователя tulvit tulvit 31 октября 2009 в 21:01

Geldora, спасибо, не знал про этот модуль. Хотелось бы конечно без использования редиректов обойтись, но если не получится, то наверное придется его и использовать, либо нечто аналогичное.

Аватар пользователя tulvit tulvit 31 октября 2009 в 21:05

RxB, хотелось бы именно 404, т.к. при обращении к site.ru/bla-bla-bla ответ 404, думаю правильно было бы тоже самое получать и при обращении к site.ru/сategory/razdel1/bla-bla-bla, а не 301

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 31 октября 2009 в 21:20

Отталкивайтесь отсюда

function supermodule_init() {
        if((arg(0) == 'category') && (arg(1) == 'razdel1') && (arg(2) == 'bla-bla-bla')){ //arg(2) поменять\заменить\проверять is_string\написать регулярник
                return drupal_not_found();
        }
}
Аватар пользователя tulvit tulvit 31 октября 2009 в 21:26

Ммм... это как я понял надо вставить в агрументы во вьюс странички? Аргументы раньше не использовал, каюсь. Видимо время пришло начать в них разбираться. За задание вектора движения, спасибо.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 31 октября 2009 в 21:28

Нет, вставить это можно в маленький самописный модуль, или добавить в существующий, заменив естественно "supermodule" на название модуля. Работа в блоке и в аргументах не гарантируется

Аватар пользователя tulvit tulvit 31 октября 2009 в 21:47

Мда, я думал это можно реализовать проще) Еще денек подожду ответов, так все еще не покидает надежда решения в два клика, ну а дальше экспериментировать.

Аватар пользователя tulvit tulvit 4 ноября 2009 в 18:16

Quote:
1. При обращении к несуществующему материалу по адресу сategory/razdel1/bla-bla-bla грузится сategory/razdel1/ и ответ сервера 200, хотя нужен 404. Ситуация еще неприятна тем, что раньше на домене весел сайт со схожей структурой с кучей материалов с такого рода адресами, сейчас получается, что эти адреса остались работоспособными и породили сотни дублей. Такое ощущение, что проблема решается парой кликов в модуле вьюс/при несуществующем адресе отдавать 404, а не страницу/, но что надо сделать так и не додумался.

Помониторил форум друпал.орг, проблема возникает у многих, но решения вроде как нет. Единственное, что советуют - использовать адрес страницы вьюс, отличающейся от адресов нод, чтобы хоть как-то минимизировать количество дублей. Т.е. в моем случае при адресе ноды category/razdel1/voc/title-node сделать адрес страницы, выводящей список нод, не category/razdel1/, а, например, category/razdel/list.
Ссылка на один из топиков http://drupal.org/node/392106
Пример на друпал.ру - http://www.drupal.ru/online как я понял, выводится через вьюс, если добавить к этому урлу, например, /jfsdlkfjs, то мы получим не 404, а 200 и дубль страницы.

Quote:
2. Адреса материалов у меня category/razdel1/voc/title-node, соответственно по адресу category/razdel1/voc мы получаем список всех нод, принадлежащих этому термину. А т.к. список нод я вывожу отдельно через вьюс, то опять таки получаются дубли. Нужно запретить доступ к просмотру списков нод, принадлежащих определённым терминам словаря, при этом не затронув доступ к сами нодам. Наверняка же есть какая-то стандартная друпаловская фича для этого.

С этим до сих пор не разобрался. Писать свой модуль или хакать ядро, как советовали выше, никакого желания нет. Чуток перефразирую вопрос - как сделать так, чтобы по ссылке taxonomy/term/№ или по ее алиасу отдавался 404-ый ответ сервера, а не выводился список нод, принадлежащих этому термину.

Аватар пользователя tulvit tulvit 4 ноября 2009 в 20:15

Нашел такой способ - в файле taxonomy.module модуля taxonomy есть функция taxonomy_menu(), если закомментировать

$items['taxonomy/term/%'] = array(
    'title' => 'Taxonomy term',
    'page callback' => 'taxonomy_term_page',
    'page arguments' => array(2),
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK,
    'file' => 'taxonomy.pages.inc',
  );

то все работает так, как мне и нужно. Т.е. при обращении ко всем страницам taxonomy/term/% или же их алиасам, сервер выдает 404 ошибку. Чем мне не нравится этот метод - хакается ядро. Хочется что-нибудь переопределить в файле template.php, но насколько я помню, переопределять можно только функции, начинающиеся с theme_. Нашел еще такую функцию в node.module

function theme_node_list($items, $title = NULL) {
  return theme('item_list', $items, $title);
}

Но ее изменение ни к чему не приводит.

Аватар пользователя tulvit tulvit 17 октября 2010 в 22:02

Проблема с дублями страниц, порождаемыми модулем Views, решена.
Нужно всего лишь установить модуль views 404.
Советую поставить этот модуль всем, а не полагаться на сообразительность поисковиков. Как видно из стартового поста, проблема у меня с дублями возникла после смены структуры сайта - с тех пор прошел год (как время бежит...), а в индексе Яндекса до сих пор сотни дублей и разного мусора.