Наверх

autoRedirector — Автоматический редирект при изменении адреса страницы

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

После установки плагин будет отслеживать изменение адресов страниц и записывать старые адреса в отдельную табличку. Если пользователь перейдет по одной из старых ссылок, плагин перенаправит его на актуальный адрес. В результате пользователь увидит искомую страничку, а не ошибку 404.

Любое автоматически созданное правило редиректа можно отредактировать вручную или удалить через специальный раздел в админке.

Дополнение доступно в репозитории Simple Dream:
store.simpledream.ru/packages/content/autoredirector.html

Кроме того, опубликовал и в официальном репозитории:
modx.com/extras/package/autoredirector

Документация: docs.modx.pro/components/autoredirector

Пробуем, тестируем, если что, в комментариях пишите о багах, ошибках и пр.


46 комментариев

  1. Владимир 06 марта 2014, 14:09 # 0
    Спасибо! Уже пометил как «must have» и вовсю использую!
    1. Владимир 19 апреля 2014, 00:24 # 0
      Илья! Позвольте обратиться с пожеланием. В новой версии autoRedirector, если можно, предусмотрите массовое удаление правил- отметить чекбоксы и удалить. Очень было бы кстати. Спасибо.
      1. Илья Уткин 19 апреля 2014, 11:13 # 0
        Попробуйте выделить строчки с зажатой клавишей Shift или Ctrl.
      2. Алексей 22 апреля 2014, 20:36 # 0
        Очень хорошее дополнение. Вот что радует — в отличии от «redirector» — (другое дополнение для modx) можно создать редирект с адреса прямо на id ресурса! давно ждал такого функционала в redirector'е, но, видимо буду пользоваться «autoRedirector»
        еще раз спасибо.

        Кстати, будет ли на этом сайте донэйт, как на безумкине?
        1. Илья Уткин 22 апреля 2014, 20:53 # 0
          В Redirector'e можно писать так: [[~76]]

          Донейт в ближайшее время вряд ли будет. Я еще не так активно развиваю сообщество.

          Хотите отблагодарить, делитесь статьями с моего сайта у себя в блоге, в твиттере, да хоть в контакте))(ссылки в футере)
          1. Алексей 22 апреля 2014, 23:33 # 0
            к сожалению, ни первым, ни вторым, ни третьим не пользуюсь. а скромное «спасибо» всетки хочется сказать…
        2. Евгений Епифанов 05 мая 2014, 15:40 # +1
          Стал пользоваться недавно. Отличное дополнения. Спасибо, Илья.
          Есть несколько предложений/замечаний (не считайте это придирками). Собственно пользовался до этого Redirector'ом, но в последних версиях какой-то баг появился — редиректы сами собой добавляются без моего участия, и перестала показываться 404 страница, всегда редирект на какой-то ресурс. Но это все не важно. Функционал там был полезный:
          — проверка добавляемого редиректа, т.е. если адрес уже ссылается на какой-то ресурс, то при добавлении того же адреса выводится ошибка (очень полезно при ручном добавлении)
          — отключение определенных редиректов, не удаление, а именно отключение.
          Вот эти приятности и хотелось бы увидеть в новых версиях.
          P.S. Это не критика, это предложения по развитию))
          1. Евгений Епифанов 12 октября 2014, 20:11 # 0
            Илья. Подскажите пожалуйста, можно ли как-то импортировать редиректы из Redirector в autoRedirector?
            1. Илья Уткин 13 октября 2014, 06:17 # 0
              Не знаю… В Redirector идет переадресация с одного адреса на другой (не важно, есть такой ресурс или нет), а autoRedirector просто записывает старые URL'ы и ставит им в соответствие конкретный id-шник ресурса.

              Я думаю, можно написать импорт, но у меня готового кода нет и я такой импорт не встречал, к сожалению.
            2. Анатолий 20 декабря 2014, 17:35 # 0
              Очень полезное дополнение. Но столкнулся с тем, что плагин autoRedirector'a не дает сохранить документ. Висит вечное «Пожалуйста подождите… Сохранение...». Документ при этом не сохраняется. В логах modx'a сообщений нет.
              Ошибка возникает при сохранении тех документов, у которых «Тип ресурса» установлен в нестандартное значение. Например, «Товар», и соответственно $class_key=='ShopmodxResourceProduct'.
              Вместо переменной $resource, есть $shopmodxresourceproduct.
              После отключения плагина, сохранение работает нормально.

              $resources = array(
                      $resource,
                      $modx->getObject('modResource',$resource->get('parent'))
              );
              1. Дмитрий 20 мая 2015, 20:48 # 0
                Здравствуйте! Проблема такая: Возможно из-за этого плагина не настроить 404 страницу и ни как не получается. Кто-нибудь встречал такое? Пользуюсь Redirector. Страница с id прописана и настроена в «Настройки системы». Но результата «0» ?????
                1. Илья Уткин 21 мая 2015, 07:14 # 0
                  Это другое дополнение. Просто названия похожие.
                  1. Тимур 08 июня 2015, 13:33 # 0
                    Илья, прошу прощения, посмотрите, пожалуйста, комментарий ниже
                2. Тимур 07 июня 2015, 09:29 # 0
                  Спасибо за дополнение, Илья!
                  Можно ли добавить редирект страниц с .html на страницы без расширения? (на старой версии сайта было расширение, теперь убрал, а страницы в поиске висят пока с расширением) И аналогично слеши в конце адресов убирать. (Было: site.ru/page/ Стало: site.ru/page)
                  1. Илья Уткин 08 июня 2015, 13:54 # 0
                    Я не знаю, как внедрить такой случай в отслеживание для дополнения, тем более в ближайшее время. Поэтому в autoRedirector'е такого не будет.

                    Но вы можете сами написать плагин, который будет делать редирект, если найдет html в URL
                    1. Тимур 08 июня 2015, 13:55 # 0
                      Спасибо.
                    2. Андрей 05 мая 2017, 18:04 # 0
                      Редирект такого типо прописывается в .htaccess либо в конфиге nginx=)
                    3. Сергей 24 июня 2015, 17:00 # 0
                      Добрый день!
                      Спасибо за дополнение, выручает.
                      Обнаружился у меня на сайте баг, когда копируешь ресурс то создаётся правило с нового ресурса на первоисточник.

                      помогите разобраться
                      1. Илья Уткин 25 июня 2015, 10:25 # 0
                        Добрый день.

                        Сейчас потестировал, у меня такого не наблюдается. Попробуйте поотключать другие плагины и проверить, повторяется ли этот баг. Возможно, есть какой-то конфликт плагинов…
                      2. Иван 30 августа 2015, 08:12(Комментарий был изменён) # 0
                        Что-то авторизация через логинзу не пашет :(

                        Если в урле есть гет-параметры редирект не отрабатывает и хотелось бы чтобы они переносились

                        site.ru/old_url/ — отрабатывает
                        site.ru/old_url/?utm_source=yandex — не отрабатывает
                        site.ru/new_url/?utm_source=yandex — сохраняем параметры
                        1. Илья Уткин 01 сентября 2015, 07:20 # 0
                          Я не знаю, как в плагине учесть такие параметры. Дело в том, что URL может быть и таким: site.ru/?id=5 и что — параметр id тоже не учитывать?
                          1. Иван 01 сентября 2015, 07:32 # 0
                            Может белый список в настройках или захардкодить utm метки?
                            1. Илья Уткин 01 сентября 2015, 08:51 # 0
                              Не знаю… К сожалению, пока некогда этим заниматься ((
                            2. Евгений 30 августа 2018, 00:44(Комментарий был изменён) # 0
                              Чтобы отрабатывало с utm метками: надо поправить plugin autoredirect следующим образом:

                              <?php
                              $resourceEvents = array('OnBeforeDocFormSave', 'OnDocFormSave');
                              if (in_array($modx->event->name, $resourceEvents)) {
                                  foreach($scriptProperties as & $object){
                                      if(
                                          is_object($object)
                                          AND $object instanceof modResource
                                          AND $original = $modx->getObject('modResource', $object->id)
                                      ){
                                          $resource = $object;
                                          break;
                                      }
                                  }
                              }
                              switch ($modx->event->name) {
                                  case "OnManagerPageInit":
                                      $cssFile = MODX_ASSETS_URL.'components/autoredirector/css/mgr/main.css';
                                      $modx->regClientCSS($cssFile);
                                      break;
                              
                                  case "OnBeforeDocFormSave":
                                      $resources = array(
                                          $resource,
                                          $modx->getObject('modResource',$resource->get('parent'))
                                      );
                                      if($child_ids = $modx->getChildIds($resource->id,50,array('context' => $resource->context_key))){
                                          $resources = array_merge($resources, $modx->getCollection('modResource',array("id:IN" => $child_ids)));
                                      }
                                  case "OnResourceBeforeSort":
                                      if (empty($resources)) {
                                          foreach ($nodes as $node) {
                                              $resources[] = $modx->getObject('modResource',$node['id']);
                                          }
                                      }
                                      foreach ($resources as $res) {
                                          if (!empty($res)) {
                                              if (!$res->getProperty('old_uri','autoredirector')) {
                                                  $res->setProperty('old_uri',$res->get('uri'),'autoredirector');
                                                  $res->save();
                                              }
                                          }
                                      }
                                      break;
                                  case "OnDocFormSave":
                                      $resources = array(
                                          $resource,
                                          $modx->getObject('modResource',$resource->get('parent'))
                                      );
                                      if($child_ids = $modx->getChildIds($resource->id,50,array('context' => $resource->context_key))){
                                          $resources = array_merge($resources, $modx->getCollection('modResource',array("id:IN" => $child_ids)));
                                      }
                                  case "OnResourceSort":
                                      if (empty($resources)) {
                                          foreach ($nodesAffected as $node) {
                                              $resources[] = $node;
                                          }
                                      }
                                      $modelPath = $modx->getOption('autoredirector_core_path',null,$modx->getOption('core_path').'components/autoredirector/').'model/';
                                      $modx->addPackage('autoredirector', $modelPath);
                                      $processorProps = array('processors_path' => $modx->getOption('autoredirector_core_path',null,$modx->getOption('core_path').'components/autoredirector/').'processors/');
                                      foreach ($resources as $res) {
                                          if (!empty($res)) {
                                              $old_uri = $res->getProperty('old_uri','autoredirector');
                                              $current_uri = $res->getAliasPath($res->get('alias'));
                                              if ($old_uri && $current_uri != $old_uri) {
                                                  $currentRuleQ = array('uri' => $current_uri);
                                                  if (!$modx->getOption('global_duplicate_uri_check')) {
                                                      $currentRuleQ['context_key'] = $res->get('context_key');
                                                  }
                                                  if ($currentRule = $modx->getObject('arRule', $currentRuleQ)) {
                                                      $response = $modx->runProcessor('mgr/item/remove', $currentRule->toArray(), $processorProps);
                                                      if ($response->isError()) {
                                                          $modx->log(modX::LOG_LEVEL_ERROR, 'AutoRedirector removing error. Message: '.$response->getMessage());
                                                      }
                                                  }
                                                  $arRule = array('uri' => $old_uri
                                                  , 'context_key' => $res->get('context_key')
                                                  , 'res_id' => $res->get('id'));
                                                  if (!$modx->getObject('arRule', $arRule)) {
                                                      $response = $modx->runProcessor('mgr/item/create', $arRule, $processorProps);
                                                      if ($response->isError()) {
                                                          $modx->log(modX::LOG_LEVEL_ERROR, 'AutoRedirector creating error. Message: '.$response->getMessage());
                                                      }
                                                  }
                                              }
                                              $res->setProperty('old_uri',$current_uri,'autoredirector');
                                              $res->save();
                                          }
                                      }
                                      break;
                                  case "OnPageNotFound":
                                      $uri = $_SERVER['REQUEST_URI'];
                                      $utm='';
                                      $count = preg_match_all("/(&|\?)([^&$]*)/i", $uri, $utmFields);
                                      for ($i = 0; $i < $count; ++$i) {
                                          $utm .=$utmFields[0][$i];
                                          $uri = str_replace($utmFields[0][$i],"",$uri);
                              
                                      }
                              
                              
                                      $uri = str_replace($modx->getOption("site_url"),"",$uri);
                                      if (substr($uri, 0, 1) == "/") $uri = substr($uri, 1);
                                      $uri = urldecode($uri);
                              
                                      $RuleQ = array('uri' => $uri);
                                      if (!$modx->getOption('global_duplicate_uri_check')) {
                                          $RuleQ['context_key'] = $modx->context->get('key');
                                      }
                                      $modelPath = $modx->getOption('autoredirector_core_path',null,$modx->getOption('core_path').'components/autoredirector/').'model/';
                                      $modx->addPackage('autoredirector', $modelPath);
                                      if ($Rule = $modx->getObject('arRule', $RuleQ)) {
                                          if ($url = $modx->makeUrl($Rule->get('res_id'))) {
                              
                                              if($utm) 
                              				{
                              				$url .= $utm;
                              				
                              				}
                              
                              
                                              $modx->sendRedirect($url,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
                                          }
                                      }
                                      break;
                              }
                              
                          2. Вероника 29 июня 2016, 18:27 # 0
                            Заметила такую странность. Стоит на 2 сайтах редирект. Если у первого замораживаешь контейнер — ресурсы подставляют в адрес его замороженное краткое имя. На втором сайте — нет. Сам ресурс отображается и замороженным юрл, а его дети — с полным. Хотя правила на эти ресурсы должны были прописаться. Не знаете от чего так? Журнал пуст.
                            1. Илья Уткин 30 июня 2016, 10:25 # 0
                              Ну autoRedirector тут не при чем — надо смотреть, как MODX генерирует URI. Сравните значения системных настроек. Например, use_frozen_parent_urisЕсли параметр включен, URI для дочерних ресурсов будет генерироваться с учётом «замороженного» URI родителя, игнорируя псевдонимы в дереве ресурсов.
                            2. Сергей 15 августа 2016, 13:34 # 0
                              Добрый день!
                              Спасибо за дополнение, выручает, но Баг так и не устранён, когда копируешь ресурс то создаётся правило с нового ресурса на первоисточник после того как нажать на кнопку сохранить в новом ресурсе. Проверил на 5 разных сайтах (могу дать доступ).
                              1. Илья Уткин 15 августа 2016, 13:42 # 0
                                Добрый день! Сейчас времени нет пока с этим разобраться. Опишите проблему здесь: github.com/ilyautkin/autoRedirector/issues — когда буду обновлять, посмотрю
                              2. Алексей Смирнов 05 сентября 2016, 12:12(Комментарий был изменён) # 0
                                Хм… как-то не сработала кирилица. В админ панели — вопросики вместо кирилицы. Печаль. modx R 2.4.2
                                1. Alex 30 марта 2017, 12:13 # 0
                                  Есть сайт на MODX 2.5.1
                                  3 языка через Babel — соответственно через контексты. Контекст web работает с плагином на отлично. А вот для других контекстов правило создает, но оно не работает. Кто-то знает куда смотреть?
                                  1. Alex 30 марта 2017, 12:44 # 0
                                    Нашел вот еще решение:
                                    Если в правило вручную прописать перед ссылкой название контекста тогда работает. Пример: en/kontaktyi.html
                                    Но не хотелось бы что-то делать вручную, тем более что плагин называется autoRedirector. )
                                    Никто с таким не сталкивался?
                                    1. Илья Уткин 08 апреля 2017, 08:41 # 0
                                      Ну тут, конечно, универсальное решение создать вряд ли получится. Создайте копию плагина autoRedirector и допишите туда свою логику. Только такой выход я вижу.
                                      1. Alex DOM 08 апреля 2017, 10:23 # 0
                                        Илья, спасибо за ответ. Есть у меня идея для универсального, попробую как-то, проблема в том что я front-end специалист, и php знаю самую малость. Идея в том, что бы поставить условие if. Если контекст не web то добавлять в ссылку спереди cultureKey/url
                                        Вот пример, я правил руками и так работает:
                                        c2n.me/3JjvgAG
                                        Если получится сделать скину Вам код )
                                  2. Вероника 16 июня 2017, 20:42 # 0
                                    А я столкнулась с такой штукой: есть мультидоменный сайт и заказчик попросил перенести один раздел из контекста в другой контекст. Редирект его не сохранил, вручную тоже, увы не редиректит. Вопрос — не конфликтует ли он с seo pro?
                                    1. Илья Уткин 17 июня 2017, 05:26(Комментарий был изменён) # 0
                                      Нет, не конфликтует. Просто перенос между контекстами компонент не редиректит. Тут надо прописывать правила в .htacces (или в конфигах nginx).
                                    2. Александр 04 сентября 2017, 11:31 # 0
                                      Столкнулся с проблемой: не работает редирект для урлов вида

                                      projects?tags%5B%5D=%F0%E5%E7%E5%F0%E2%ED%EE%E5%20%FD%ED%E5%F0%E3%EE%F1%ED%E0%E1%E6%E5%ED%E8%E5

                                      После переноса старого сайта, в поиске остались адреса. Попытался настроить редиректы и вот, не работает (
                                      1. Илья Уткин 04 сентября 2017, 11:47 # 0
                                        Попробуйте дополнение Redirector — всё-таки, autoRedirector больше направлен на работу с URL ресурсов.
                                      2. Александр Ленк 22 января 2018, 10:58 # 0
                                        Привет Илья, нашел мини баг:
                                        Когда создаешь правило, то контекст заполнен joxi.ru/Grqel3NfNDaxZr
                                        А когда второй раз создаешь правило, то контекст уже пустой, надо постоянно копировать слово web joxi.ru/vAWYWgwIkZWyem

                                        Вот так вот :)
                                        1. Илья Уткин 23 января 2018, 13:06 # 0
                                          Записал себе, надеюсь, найду время поправить))
                                        2. Amsterdam 22 января 2018, 15:56 # 0
                                          Как он работает то?) Указываю URL, id ресурса простой цифрой, ничего не происходит. Что не так?)…
                                          1. Александр Ленк 23 января 2018, 12:29 # 0
                                            вот так joxi.ru/xAeeyPafY1JQ0A
                                          2. Денис Чубенко 17 июля 2018, 18:06 # 0
                                            Добрый день, Илья. У меня не большой баг при использовании autoRedirector.
                                            На сайте использую Удалить index из URL ресурсов, дочерних главной, при сохранении ресурса, в autoRedirector добавляется правило с параметром URI index/… При копировании и переходе по такой ссылке, иногда выкидывает на 404 страницу. После удаления правила, при повторном сохранении в правиле уже будет index/index/… Как можно исправить такое?
                                            1. Илья Уткин 23 июля 2018, 06:54 # 0
                                              Ну можно попробовать в коде плагина проверять ID ресурса и, если он равен главной, просто не создавать правила.
                                              1. Денис Чубенко 25 июля 2018, 05:06 # 0
                                                Я не понятно написал :-) Про другое я. Есть url — site.ru/texnicheskie-gazyi-i-gazovyie-smesi/uslugi/ в нем удален index/, но при авто сохранении autoRedirector,
                                                создастся правило — index/texnicheskie-gazyi-i-gazovyie-smesi/uslugi/, а такого url не существует и по нему ни кто не придет. Получается надо изменить в плагине autoRedirector, что бы вырезало index/ из url при сохранении правила?
                                            2. Илья 18 июля 2018, 12:00 # 0
                                              Илья добрый день.
                                              Разъясните пожалуйста как с данным плагином можно настроить мультидоменность на сайте modx.
                                              Например чтобы обычная страница site.ru/page открывалась на page.site.ru

                                              1. Илья Уткин 23 июля 2018, 06:52 # 0
                                                Никак, этот компонент не предназначен для создания мультидоменности

                                              Авторизация

                                              через сервис Loginza:

                                              Подписка или RSS

                                              Буду присылать новые статьи — никакого спама



                                              Шаблоны MODX

                                              1 2 Дальше »

                                              Объектная
                                              модель
                                              MODX