Сегодня небольшая статья больше подходит для сеошников, нежели разработчикам, но и нам с вами думаю будет полезна. Все мы прекрасно знаем модуль views и на себе ощущаем всю его мощь и удобство использования. Но уже не первый раз приходится сталкиваться с тем, что представление с пустым аргументом никак не хочет отдавать 404 код, а именно «страница не найдена».
Теперь давайте наглядно покажу, что я имею ввиду, если кто-то еще не понял. Например, у нас есть некое представление, которое создает страницу с выводом нод какого-то типа материала, а так же дали возможность сортировки пользователям.
Все бы вроде хорошо и прекрасно работает, только есть одно но, данная страница будет доступна и при пустом аргументе, например – это может выглядеть так:
Как видим, мы дописали к странице с представлением какой-то текст (текст не важен), но в ответ мы получили все равно страницу с нашим представлением. С точки зрения разработки, представление сработало правильно, так как исходя из данного URL мы передали ей пустой аргумент для сортировки, в следствии чего представление выводит свои дефолтные значения. А вот с точки зрения СЕО, данный подход абсолютно не правильный и может плодить дубли в поисковых системах.
Теперь, думаю вы поняли о чем шла речь в начале статьи. Для решения данной проблемы нам нужно на не существующие URL отдавать код 404 (страница не найдена). А так как мы уже знаем что представление ведет себя так при передаче пустого аргумента, то нам нужно лишь написать условие в представлении, что для пустого аргумента отдавать страницу 404.
К реализации. Переходим на страницу редактирования представления «Структура - > Представления - > Имя вашего представления» и добавляем «Контекстный фильтр»
Далее в настройках выбираем «Глобальный: Null»
Жмем «Применить». Далее в настройках указываем критерии проверки, и в качестве проверки выбираем «PHP-код»
Ну и теперь пишем код, который будет проверять передаем ли мы пустой аргумент в URL:
return TRUE; } else { return FALSE; }
Далее «Жмем применить» и сохраняем представление. И теперь проверяем что у нас получилось.
Как мы видим, все у нас теперь работает как надо. С задачей справились.
Дополнение от 11.06.2015Возвращаем 301 редирект с URL, которые на конце имеют слеш "/"
<?php /** * Implements hook_preprocess_page */ function themename_preprocess_page(&$variables){ $url = request_uri(); if($url != "/" ){ } } }
Возвращаем 301 редирект со страницы http://example.com/node
<?php /** * Implements hook_preprocess_page */ function themename_preprocess_page(&$variables){ if($url == '/node'){ } }
Комментарии (5)
php код в проверке не обязателен - в настройках есть уже опция для проверки получения аргументов http://drupalspb.org/articles/znikiru/views-tolko-po-konkretnomu-url-adresu
Впринципе да, так тоже сработает.
огромное спасибо, пошел внедрять на свои сайты... "от души"
Подскажите, как сделать проверку что вьювс возвращает (хоть какой то контент), при наличии аргументов, к примеру при пагинации ?page=1 и ?page=1001 вернут все равно 200 вместо 404 , но на ?page=1001 контента нет.
Как сделать проверку при пагинации? Т.е. есть ль возможность определить что вернул запрос и при пустом запросе выдавать 404
Большое спасибо за статью, проблема актуальная, так как действительно страницы категорий созданные через вьюс не отдают 404 ошибку если к ним добавить любые символы