Форум пользователей Impera CMS
Impera CMS - отличный движок для лёгкого создания интернет магазина.
Обладает невероятным количеством функций, необходимых в онлайн торговле.

Следить
Главная
11:55
18 июл
#
?
ANM написал:

Обнаружил что при обращении к несуществующей странице например http://demo.imperacms.com/error_test движок отдает страницу с кодом ответа сервера: 200

HTTP/1.1 200 OK
Server: nginx/1.0.5
Date: Thu, 18 Jul 2013 08:40:02 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
X-Powered-By: PHP/5.2.17
Set-Cookie: PHPSESSID=256302182075f5785b88a7c1a7145d48; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding,User-Agent

Насколько я помню, это плохо с точки зрения SEO. Должен быть "HTTP/1.1 404 Not Found".

Как это исправить?

И еще в админке задана страница предназначенная для ответа 404, но когда и как она отдается посетителю непонятно.

19:33
18 июл
#
?
EraUa написал:

Меня тоже этот вопрос интересует, т.к. уже несколько таких страниц попало в поиск. Страница ответа в фирменном стиле показывается, но ответ тоже должен быть 404.

Инструменты веб-мастера в поисковиках тоже ругаются по этому поводу.

18:50
19 июл
#
?
написал:

Я подразобрался сам с 404 кодом ответа у имперы. Собака порылась в admin.page.php.

1. Значится т.к. импера как популярные цмс использует mod_rewrite для чпу урлов страниц, эти страницы по любому имеют тень.

http://demo.imperacms.com/login
и тень
http://demo.imperacms.com/?module=Login

Не знаю как по настоящему тень влиет на seo. Но т.к. у всех цмс на mod_rewrite те же бусы с тенью присудствуют, считаем не вопросом. На крайняк закроем тени от пауков через robots.txt как то так

Disallow: /*?module=*
Disallow: /*?*&module=*

2. Функция особых урлов имперы привела к появлению контролируемого цмской урл пространства. Т.е. строка 149 файла .htaccess уже не направляет на спецстраницу 404, что в бекенде "страницы" + "Специальные страницы" + "Другие страницы" + "Страница не найдена".

# При отсутствии документа перенаправляем на такой url

ErrorDocument  404  /sections/404

Т.е. сервер apache не разберет что http://demo.imperacms.com/test_missing_image.gif это же ErrorDocument. Особые урлы все таки включены. М.б. админ подсадит потом на этот урл свою страницу. Бред, кому в голову придет, но возможный.

3. Спецстраница "Страница не найдена" http://demo.imperacms.com/sections/404 это простая с кодом ответа сервера 200 OK.

Какой смысл в направлении на нее? Ну админ перепишет текст по вкусу. Прекрасно. То же достижимо через 404.htm файл шаблона. Запросто перепишет если нужно.

Что как не демобазу используем? Админу помнить еще создай страницу 404 с урлом как в .htacces. Это задача шаблона. Как запроектировано дизайном. Так пусть и будет 404 в шаблоне.

4. У имперы из бекенда админом отключаемы любые модули. Так "страницы" + "Зарегистрированные модули" + лампочка выключить. Т.е. по настоящему имеем 2 вида 404 - страница не найдена "нет такого товара", страница не обслуживается "нет такого модуля или отключен".

http://demo.imperacms.com/test_missing_tovar

http://demo.imperacms.com/?module=test_missing_module

Мыслю так в обоих должен возвратиться ответ 404.

Между строками 1172-1173 и между 1458-1459 файла admin.page.php вставляем одинаковую строку

header('HTTP/1.0 404 Not Found');

Вот и все дела!

З.Ы. Сейчас посмотрел исходники, у имперы оказалось есть еще 2 вида 404 - страница не предусмотрена шаблоном, содержимое страницы закрыто от неавторизованных посетителей.

Какая хитрая цмс

Мыслю так эти случаи логично что отдаются ответом 200 OK. Из индекса не вылетят страницы, важные авторизованным юзверям. На мультишаблоных сайтах не вылетят страницы, доступные в других шаблонах, где страница предусмотрена.

У-ф-ф. Запечатался, в поте лица. Аж клавиатура задымилась

23:05
19 июл
#
?
EraUa написал:

Не очень понял что нужно изменить в системе если у меня такой случай:

Ввожу несуществующий адресс, например site.com/fdkjhdkjghd - открывается страничка предусмотренная шаблоном, большая надпись 404 и страница не найдена, предлашает на выбор разные разделы сайта, всё как нужно, тег Title тоже висит "Страница не найдена", адресс тот же остаётся site.com/fdkjhdkjghd, чтобы пользователь мог видеть где совершил ошибку.

НО, проблема в том что со всем этим делом отдаётся код 200, а нужен 404.

00:31
20 июл
#
?
kris написал:

Файл objects/Admin.Page.php. Строка 1172. За ней вставляем header(...).

      ...
      ...
      // пробуем найти такой модуль в списке зарегистрированных,
      // если не найден или это сторонний и их не разрешено использовать, выходим
      if ($module != "") {
        $module = str_replace("\\", "", $module);
        $module = str_replace("/", "", $module);
        $module = str_replace(":", "", $module);
        $module = trim($module);
        if ($module != "") {

          // создаем контент на случай, если модуль не найдется или он запрещен
          $this->body = str_replace("<", "&lt;", $module);
          $this->body = str_replace(">", "&gt;", $this->body);
          $this->body = str_replace("*", $this->body, CONTENT_MESSAGE_NO_MODULE);

          $params = new stdClass;
          $params->class = $module;
          $params->enabled = 1;
          $params->plugin = 0;
          $this->db->get_module($item, $params);
          if (empty($item) && !$this->extensible) {

            // закрываем трассировку этого метода
            $this->db->close_tracing_method();
            header('HTTP/1.0 404 Not Found');
            return;
          }
          ...
          ...

Дальше строка 1458. Точнее стала 1459 после сделанного выше. За ней вставляем то же.

        ...
        ...
        // читаем список незапрещенных кредитных программ и передаем в шаблонизатор
        $params = new stdClass;
        $params->sort = SORT_CREDITPROGRAMS_MODE_BY_TERM;
        $params->sort_direction = SORT_DIRECTION_ASCENDING;
        $params->sort_laconical = SORT_LACONICAL_ON;
        $params->enabled = 1;
        $this->db->credit_programs->get($credits, $params);
        $this->db->credit_programs->unpack_records($credits);
        $this->smarty->assignByRef("credit_programs", $credits);

      } else {
        // иначе модуль не был задан, создаем контент на этот случай неизвестного типа страницы
        $this->body = CONTENT_MESSAGE_NO_PAGE;
        header('HTTP/1.0 404 Not Found');
      }
      ...
      ...

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

10:20
20 июл
#
написал:

Низкий поклон kris и особенно Из кур щавель за проделанную работу и с подробностями. Обязательно внесу эти правки в следующую версию.

Сейчас же поправлю неточность Из кур щавеля, изложенную в его пункте 2. Дело в том, что несмотря на появившееся в Impera CMS пространство особых адресов, контролируемое движком, веб сервер Apache, впрочем как и другие, тем не менее отслеживает статус ErrorDocument для отсутствующих на сайте изображений, музыкальных и видеофайлов, архивов и тому подобное.

Обратите внимание, что по следующим несуществующим адресам открываются две разные страницы 404:


Таким образом, специальная страница 404 в админпанели вполне оправдана. Только она предназначена не для отсутствующих товаров, статей и подобного, а строго для отсутствующих файлов. Правильнее было назвать ее страницей "Файл не найден".

Поскольку эта специальная страница отдается с кодом 200, покажу ниже на скриншотах (все кликабельны для увеличения), как добавить только на эту страницу код ответа 404.

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



Теперь находим в списке страницу, предназначенную для события "Страница на нейдена" (файл не найден), и щелкаем по ее названию, чтобы отредактировать.



Важный момент: Impera CMS поддерживают работу с плагинами, что дает возможность выполнить на отдельных страницах какие-то свои действия, не предусмотренные движком.

У товаров, статей, новостей, специальных страниц и так далее есть поле Плагины:, где можем перечислить через запятую имена тех плагинов, какие хотим запустить в перечисленном порядке, когда посетитель попал именно на эту страницу.

Предположим, мы написали какой-то свой малюсенький плагин Page404 (его полный код приведен в конце поста). Имя этого плагина укажем в соответствующем поле, что показано на скриншоте.



Схема работы с плагином: Когда движок начинает "рисовать" некоторую страницу, он сначала смотрит, пожелал ли менеджер магазина подключить к этой странице какие-то свои плагины. Если так, движок поочередно загружает указанные плагины и отдает управление им. В ответ ожидает, что "скажет" каждый плагин. Варианты ответа таковы по смыслу:

  • требую немедленно прекратить отрисовку страницы и показать СООБЩЕНИЕ (его формирует сам плагин)
  • разрешаю продолжать и прошу добавить на страницу НЕКУЮ ИНФОРМАЦИЮ (сформированную плагином)

Таким образом, плагин - это средство выполнить перед страницей какие-то действия и сообщить движку свой вердикт или какой информацией хотелось бы дополнить данную страницу. Причем вывести эту информацию можно в необходимой точке шаблона с помощью следующей инструкции, где вместо помеченного синим цветом достаточно поставить имя любого другого плагина, написав имя строчными буквами. Завершающий модификатор |default:'' предохраняет работу шаблона от ситуации, когда плагина нет вообще на сайте, или менеджер магазина пока отключил его, или посетитель находится на странице, где менеджер не приказывал запустить плагин.

    ...
    ...

    {* здесь хотим показать результат плагина SomeThing *}
    {$plugin_something|default:''}


    {* здесь хотим показать результат плагина HelloWorld *}
    {$plugin_helloworld|default:''}

    ...
    ...


Хотелось бы отметить, что Impera CMS - это одна из немногих систем с очень высокой управляемостью из админпанели. Менеджер магазина может управлять даже тем, какие плагины разрешает или запрещает использовать.

Для примера рассмотрим, как происходило бы добавление воображаемого нами плагина Page404. Первым делом менеджер переходит на страницу зарегистрированных модулей.



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



Форма регистрации плагина показана ниже. Наиболее важные поля - это Класс: и флажки. От имени класса зависит имя PHP-файла, в котором будет размещен исходный код плагина или модуля.

Отличие модуля и плагина в том, что модуль предназначен для полной обработки конкретного типа страниц - условно говоря, модуль рисует центральную часть страницы строго определенного типа, а плагин - для интеграции какого-то (скажем небольшого) блока информации в любую страницу, где плагин пожелали запустить, или же запрета отрисовки этой страницы. То есть плагины запускаются как бы "из модуля", однако в тот момент, когда он уже создан, но еще не начал действовать.



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



Два следующих скриншота показывают, где производить коррецию корневого файла .htaccess, если для специальной страницы 404 менеджер магазина вдруг изменил URL страницы. Сначала переходим на страницу редактирования этого файла.



Далее исправляем нужное место файла на тот новый относительный URL, что был назначен странице 404. За всю практику этот URL никто ни разу не менял. Но во всяком случае будете знать, где это сделать.



Осталось показать исходный код плагина Page404. Делаем следующее:

  • находим внутри движка папку http://сайт/objects/
  • создаем в этой папке вложенную папку page404, то есть получили http://сайт/objects/page404/
  • и уже в этой папке создаем файл Page404.php следующего содержания

    // =======================================================================
    /**                                                                       
    *  Плагин отправки кода ответа "HTTP/1.0 404 Not Found"                   
    *                                                                         
    *  @package     Impera CMS                                                
    *  @link        http://imperacms.com/                                      
    */                                                                        
    // =======================================================================

    class Page404 {


        public $body = '';


        // ===================================================================
        /**                                                                   
        *  Конструктор класса                                                 
        *                                                                     
        *  @access  public                                                    
        *  @param   object  $impera     объект движка                         
        *  @return  void                                                      
        */                                                                    
        // ===================================================================

        public function __construct ( & $impera ) {
        }


        // ===================================================================
        /**                                                                   
        *  Запуск плагина                                                     
        *                                                                     
        *  @access  public                                                    
        *  @param   object  $module     модуль, из которого был вызван плагин 
        *  @return  boolean             TRUE = продолжить, FALSE = прекратить 
        */                                                                    
        // ===================================================================

        public function fetch ( & $module ) {


            // отправляем код 404
            header('HTTP/1.0 404 Not Found');


            // не хотим дополнять контент страницы своей информацией
            $this->body = '';


            // разрешаем продолжить отрисовку страницы
            return TRUE;
        }
    }


То есть плагин должен содержать, как минимум, общедоступное свойство body, общедоступный метод fetch и конструктор __construct (необязательно).

15:50
20 июл
#
?
ANM написал:

Друзья, спасибо огромное! Теперь все работает как надо!

Цитата: "kris: Надо бы разработчику внести это в апгрейды. Иначе постоянно исправлять будем."

Я уже давно составил длинный документ с фрагментами кода, который необходимо заменить после очередного обновления двигла. Крайне неудобно, и напрягает. Благо обновления редко выходят. Когдато отказался от WebAsist по этой же причине. Вот если бы можно было разделить ядро и модули!? Чтобы даже любые процедуры PHP можно было переопределять в своем модуле...

16:42
20 июл
#
?
EraUa написал:

Внёс эти изменения и всё теберь работает как нужно! Спасибо за подсказку!

Также напомню разработчику внести это в обновления, чтобы ни о чём не беспокоится когда выйдет новая версия.

12:52
24 июл
#
?
ANM написал:

А как быть с такими адресами:

  • Несуществующий товар http://demo.imperacms.com/products/missing_document
  • Несуществующая категория http://demo.imperacms.com/catalog/missing_document
  • Несуществующий бренд http://demo.imperacms.com/brands/missing_document

Все они отдают ответ 200, не смотря на вышеописанные правки.

Написание ответа

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


Обратите внимание! Для противодействия спаму новые посты форума проявляются с задержкой от нескольких минут, пока не пройдут модерацию.