• статья
  • pantey

Возвращаем ответ 404, при пустом аргументе в views

24.06.2014

Сегодня небольшая статья больше подходит для сеошников, нежели разработчикам, но и нам с вами думаю будет полезна. Все мы прекрасно знаем модуль views и на себе ощущаем всю его мощь и удобство использования. Но уже не первый раз приходится сталкиваться с тем, что представление с пустым аргументом никак не хочет отдавать 404 код, а именно «страница не найдена».

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

Url по которому доступно наше представление

Все бы вроде хорошо и прекрасно работает, только есть одно но, данная страница будет доступна и при пустом аргументе, например – это может выглядеть так:

Изменили Url

Как видим, мы дописали к странице с представлением какой-то текст (текст не важен), но в ответ мы получили все равно страницу с нашим представлением. С точки зрения разработки, представление сработало правильно, так как исходя из данного URL мы передали ей пустой аргумент для сортировки, в следствии чего представление выводит свои дефолтные значения. А вот с точки зрения СЕО, данный подход абсолютно не правильный и может плодить дубли в поисковых системах.

Теперь, думаю вы поняли о чем шла речь в начале статьи. Для решения данной проблемы нам нужно на не существующие URL отдавать код 404 (страница не найдена). А так как мы уже знаем что представление ведет себя так при передаче пустого аргумента, то нам нужно лишь написать условие в представлении, что для пустого аргумента отдавать страницу 404.

К реализации. Переходим на страницу редактирования представления «Структура - > Представления - > Имя вашего представления» и добавляем «Контекстный фильтр»

Добавляем контекстный фильтр

Далее в настройках выбираем «Глобальный: Null»

Добавляем фильтр "Глобальный: Null"

Жмем «Применить». Далее в настройках указываем критерии проверки, и в качестве проверки выбираем «PHP-код»

Указываем критерии проверки, в качестве типа проверки выбрали "PHP-код"

Ну и теперь пишем код, который будет проверять передаем ли мы пустой аргумент в URL:

  1. if (empty($argument)) {
  2. return TRUE;
  3. } else {
  4. return FALSE;
  5. }
проверяем, передаем ли пустой аргумент в Url

Далее «Жмем применить» и сохраняем представление. И теперь проверяем что у нас получилось.

Отдали код 404

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

Дополнение от 11.06.2015

Возвращаем 301 редирект с URL, которые на конце имеют слеш "/"

  1. <?php
  2. /**
  3.  * Implements hook_preprocess_page
  4.  */
  5. function themename_preprocess_page(&$variables){
  6.  
  7. $url = request_uri();
  8. if($url != "/" ){
  9. if(substr($url,-1) == '/'){
  10. $new_url = substr($url,0,-1);
  11. $new_url = substr($url,1,-1);
  12. drupal_goto($new_url, array(), 301);
  13. }
  14. }
  15.  
  16. }

Возвращаем 301 редирект со страницы http://example.com/node

  1. <?php
  2. /**
  3.  * Implements hook_preprocess_page
  4.  */
  5. function themename_preprocess_page(&$variables){
  6.  
  7. if($url == '/node'){
  8. drupal_goto('http://www.example.com', array(), 301);
  9. }
  10.  
  11. }
-->
Узнавай о новых статьях сайта - первым. Просто подпишись на рассылку.

Комментарии (5)

Profile picture for user Егор
drupby
24.06.2014

php код в проверке не обязателен - в настройках есть уже опция для проверки получения аргументов http://drupalspb.org/articles/znikiru/views-tolko-po-konkretnomu-url-adresu

Profile picture for user pantey
pantey
24.06.2014

Впринципе да, так тоже сработает.

Profile picture for user shtrlz
shtrlz
25.02.2015

огромное спасибо, пошел внедрять на свои сайты... "от души"

Profile picture for user Егор
Александр
12.01.2016

Подскажите, как сделать проверку что вьювс возвращает (хоть какой то контент), при наличии аргументов, к примеру при пагинации ?page=1 и ?page=1001 вернут все равно 200 вместо 404 , но на ?page=1001 контента нет.

Как сделать проверку при пагинации? Т.е. есть ль возможность определить что вернул запрос и при пустом запросе выдавать 404

Profile picture for user Егор
Виктор
04.10.2017

Большое спасибо за статью, проблема актуальная, так как действительно страницы категорий созданные через вьюс не отдают 404 ошибку если к ним добавить любые символы