Наверх

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

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

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

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

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

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

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

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


53 комментария

  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
                                                Никак, этот компонент не предназначен для создания мультидоменности
                                              2. Александр 26 сентября 2019, 11:54 # 0
                                                Илья, добрый день. Спасибо за отличное дополнение, работает на ура в режиме PHP модуль Apache. Проверил в режиме PHP-FPM редиректы не работают к сожалению.
                                                1. Алексей 15 февраля 2022, 17:20 # 0
                                                  При настройке вложенности в URL не отрабатывает, так и должно быть?
                                                  1. Илья Уткин 15 февраля 2022, 20:17 # 0
                                                    Нет, учитываются и вложенные URL
                                                  2. Сергей 16 февраля 2022, 05:21 # 0
                                                    Обнаружен следующий БАГ.
                                                    При версии php выше чем 7.4 (т.е. тестировал на 8.0 и 8.1)
                                                    Не позволяет сохранять ресурсы объявленные, как родительские категории.

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

                                                    Будет ли какое-то решение в ближайшее время?
                                                    1. Илья Уткин 16 февраля 2022, 06:55 # 0
                                                      Спасибо за багрепорт. Если будет в будущем клиент с такой проблемой, сделаю новую версию. Если у вас есть какое-то решение, можете прислать PR — это будет очень здорово github.com/ilyautkin/autoRedirector
                                                      1. Сергей 16 февраля 2022, 10:08 # 0
                                                        А сколько будет стоить доработка Вашего модуля Вами?

                                                        Данные моего сервера php8.1.2 / MySQL 8.0.27 / MODX Revo 2.8.3-pl
                                                    2. Serg 28 ноября 2023, 11:49 # 0
                                                      Добрый день!
                                                      Илья, спасибо за чудесное расширение.
                                                      Обнаружил вот какую особенность: если в настройках сайта задана страница для несуществующей страницы (404), то редирект не отрабатывает, а показывает страницу 404. Есть ли возможность сделать так, что б на заданную в настройках страницу 404 перенаправляло только в случае, если нет правила для autoRedirector'a?

                                                      Авторизация

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


                                                      Шаблоны MODX

                                                      1 2 Дальше »

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