Редирект и запрет индексации внешних ссылок

Плагин срабатывает на пререндер страницы, отлавливает все внешние ссылки, и, в зависимости от настроек, делает редирект через внутреннюю страницу, добавляет target="_blank", rel=«nofollow» или оборачивает в noindex.

Доступные параметры:

  • use_redirect — заменять внешние ссылки на редирект через внутреннюю страницу
  • redirect_page_id — ID страницы, которая отвечает за редирект внешних ссылок
  • use_stop_words — использовать стоп слова в адресе ссылки
  • stop_words — список стоп слов, разделитель запятая
  • use_stop_classes — использовать стоп классы (либо другие атрибуты ссылки, идет проверка stripos по полному html коду ссылки)
  • stop_classnames — список стоп атрибутов, разделитель запятая
  • add_blank — добавлять ссылкам атрибут target="_blank"
  • add_nofollow — добавлять ссылкам атрибут rel=«nofollow»
  • add_noindex — добавлять ссылкам обертку noindex
В комплекте идет простенький сниппет extLinkRedirector, который можно использовать с включенным параметром use_redirect. Для этого, создайте новый документ с пустым шаблоном, в поле «Содержимое» вызываем:
[[!extLinkRedirector]]

После сохранения, смотрим ID созданного документа, открываем плагин extLinkRedirector, переходим в параметры, разблокируем параметры по умолчанию. Ставим use_redirect — Да, redirect_page_id — вписываем ID созданного документа. В моем случае, алиас у страницы со сниппетом редиректа задан away, ссылки имеют вид:

http://*****.**/away?url=http://modx.com

Скачать транспортный пакет можно с GitHub

Компонент бесплатный. Буду рад замечаниям и предложениям по улучшению функционала.
Кирилл
15 февраля 2016, 10:55
modx.pro
31
9 713
+14

Комментарии: 39

Виталий Барышников
16 февраля 2016, 14:24
0
Здравствуйте. Не пойму как его поставить. Загрузил транспорт.zip и нажал «Установить», а там ошибка
Консоль запущена...
Пробуем установить пакет с подписью: extlinkredirector-0.1-beta
Пакет найден... сейчас идёт подготовка к его установке.
xPDOZip: Error opening archive at **********/core/packages/extlinkredirector-0.1-beta.transport.zip
Could not unpack package **********/core/packages/extlinkredirector-0.1-beta.transport.zip to **********/core/packages/. SIG: extlinkredirector-0.1-beta
Невозможно установить пакет с подписью: extlinkredirector-0.1-beta
    Кирилл
    16 февраля 2016, 15:11
    0
    Доброго дня. Может быть проблема с правами? На modhost тестовом только что проверил. Да и у меня на 3 сайтах без проблем установилось.



    Проверить работу можно тут: s4437.h2.modhost.pro/
      Виталий Барышников
      16 февраля 2016, 16:55
      0
      Всё хорошо, у меня файл качнулся битым, заново качнул и всё ОК.
    Андрей
    16 февраля 2016, 22:39
    0
    На одном новостном сайте как-то приглядывал такие редиректы, но не знал как у себя на MODX реализовать. Спасибо, отличный компонент.
      Борода
      17 февраля 2016, 09:06
      0
      Я, по ходу, чего-то не понимаю в этой жизни. Как его правильно скачать с ГитХаба и установить? У меня такая же ошибка как и у Виталия.
      Делаю так: ПКМ на extlinkredirector-0.1-beta.transport.zip — сохранить как… Затем в Модэксе загружаю пакет и устанавливаю.
        Кирилл
        17 февраля 2016, 10:45
        0
        Нажимаем на файл extlinkredirector-0.1-beta.transport.zip, потом на кнопку Raw.
        Должно начаться скачивание файла.
          Борода
          17 февраля 2016, 13:22
          0
          Лучи добра тебе, добрый молодец.
        Борода
        17 февраля 2016, 13:29
        0
        Автору благодарность!
        Можно только чуть подробнее для таких как Я разъяснить следующие параметры:
        stop_words — список стоп слов, разделитель запятая
        stop_classnames — список стоп атрибутов, разделитель запятая
        Не понимаю, зачем и для чего нужны стоп слова и стоп классы)

          Кирилл
          17 февраля 2016, 13:38
          +1
          По этим параметрам исключаются внешние ссылки, которые не должны обрабатываться плагином. Допустим, ссылки на modx.pro и на modstore.pro надо оставить в неизменном виде, в stop_words пишем «modx.pro,modstore.pro» (без кавычек). Таким образом, если в ссылке содержится хоть одна из этих фраз, она вообще никак не модифицируется. Поиск идет по атрибуту «href».

          Параметр stop_classnames работает несколько иначе. Он ищет совпадение слов в полном коде ссылки. У меня за это отвечает класс «extlink». Например, эти ссылки плагин не тронет:

          <a href="http://modx.com" class="extlink">modx.com</a>
          <a href="http://modx.com" data-link="extlink">modx.com</a>
          <a href="http://modx.com" id="extlink">modx.com</a>
            Владимир
            05 августа 2016, 05:42
            0
            А вот эта (stop_words) фишка наиумнейшая))!!! Для мультидоменных сайтов просто must have!
            Вопроос: В репозитарии хоть каком то планируется размещение пакета? Да, ставить секунды, но если из репозитария — удобнее же)
        Роман Воропаев (Volk)
        19 февраля 2016, 09:19
        0
        Есть небольшая особенность в этом компоненте, если мы пишем стоп слова, то они чувствительны к регистру. Т.е. если напишем в стоп слова site.ru а сама ссылка на сайте будет Site.ru, то исключение не сработает, и нужно в стоп словах прописать site.ru,Site.ru
          Кирилл
          19 февраля 2016, 09:41
          0
          Странно, у меня регистр не имеет значения. Посмотрим, может кто еще отпишется по поводу этой проблемы, сделаем немного по другому. Сейчас вот таким образом проверка идет:

          foreach ($words as $word) if (stripos($data, trim($word)) !== false) return true;

          Документация: stripos — Возвращает позицию первого вхождения подстроки без учета регистра
          Борода
          12 марта 2016, 13:15
          0
          Почему, если ссылка относительная, плагин её воспринимает как внешнюю? Редиректа нет, но добавляет target="_blank", rel=«nofollow»

          <a rel="nofollow" target="_blank" href="/razdel/categoriya/statya" title="заголовок">

          Как это можно поправить?
            Кирилл
            13 марта 2016, 08:45
            0
            Не заметил такой проблемы, вот тут можно поглядеть: s4737.h2.modhost.pro/

            Ссылка	s4737.h2.modhost.pro/manager/
            Логин	s4737
            Пароль	I03qKiPI5gGQ
              Борода
              13 марта 2016, 16:47
              0
              И у меня пропала. Я сайт на https перевёл. Может из-за этого было. Кеш или ещё чего там…
              Благодарю за обратную связь.
            Виталий Барышников
            26 апреля 2016, 06:57
            0
            Привет. Не работает с ссылками, в которых есть другие блоки, мой пример:
            <a href="http://site1.ru/">Ссылка 1</a> // будет обработана
            <a href="http://site1.ru/"> // НЕ будет обработана
                        <img src="[[++rb_base_dir]]img/logo1.png" alt="Лого1"/>
                        <span>Ссылка 1</span>
            </a>
              Кирилл
              26 апреля 2016, 07:42
              +1
              Самое простое — написать весь этот код в одну строку:

              <a href="http://site1.ru/"><img src="[[++rb_base_dir]]img/logo1.png" alt="Лого1"/><span>Ссылка 1</span></a>
            Александр
            04 августа 2016, 20:52
            0
            Спасибо за компонент!
            Было бы здорово ещё добавить возможность устанавливать задержку в миллисекундах )
              Кирилл
              05 августа 2016, 07:47
              0
              А зачем эта задержка? Что-то даже прикинуть не могу, какая от этого может быть польза.
                Александр
                05 августа 2016, 15:15
                0
                Ну например, баннер рекламный воткнуть какой-нибудь ) или предупреждение, что внешняя ссылка может вести на сайт с вредоносным кодом, предложить не уходить с сайта.
                  Кирилл
                  11 августа 2016, 14:02
                  +1
                  Замени сниппет extLinkRedirector на такой
                  <?php
                  if (isset($_GET['url'])) {
                      $url = $modx->stripTags($_GET['url']);
                      if (!isset($delay)) $delay = 3;
                      else $delay = floatval($delay);
                      return '<script>setTimeout(function() { location.href = "'.$url.'"; },'.($delay*1000).');</script>';
                  }
                  return;
                  Потом на странице, которая будет осуществлять редирект вызываем:
                  [[!extLinkRedirector? &delay=`5`]]
                  Где delay — задержка в секунда перед редиректом. По умолчанию 3 секунды, даже если параметр не указан.
                    Александр
                    12 августа 2016, 03:50
                    0
                    Спасибо, как раз то что нужно! )
                  Дмитрий Иванов
                  05 августа 2016, 18:23
                  0
                  В чем проблема сделать это самому на странице указанной в redirect_page_id? это же элементарщина
                    Konstantin
                    11 августа 2016, 13:45
                    0
                    наверное сложность в том что с этой страницы он не задерживаясь редиректит, а нужно чтобы тыкали или через определенное время автоматом переходило )
                      Дмитрий Иванов
                      11 августа 2016, 13:49
                      0
                      А если убрать оттуда сниппет и сделать js редирект с какой нужно задержкой?
                Борис И
                04 февраля 2017, 11:15
                0
                Оличное решение, спасибо.
                  varanika
                  21 марта 2017, 19:39
                  0
                  Вот и у меня что-то не так идет. В верху сайта есть:
                  <li><a href="[[~1]]" title="[[#1.menutitle]]">[[#1.menutitle]]</a></li>
                  На выходе
                  <li><a rel="nofollow" target="_blank" href="/" title="Главная">Главная</a></li>
                  Хотя на остальных сайтах такого не замечала :(
                    Кирилл
                    22 марта 2017, 06:13
                    0
                    Не видя сайта, не смогу помочь. Отправьте ссылку на почту, в профиле кнопка.
                    Или, если проблема только с этой ссылкой, можете использовать «stop_classnames».
                    digorev
                    23 апреля 2017, 00:01
                    0
                    Ребята, а что делать если плагин успешно добавляет nofollow и blank но совсем не реагирует на настройки, да и ссылки не преобразовывает? ( Я уже пробовал по-всякому, ничего не получается
                      Кирилл
                      23 апреля 2017, 09:05
                      0
                      На какие настройки не реагирует? Опишите проблему подробнее, желательно с примерами.
                      Bress
                      10 августа 2018, 15:10
                      0
                      Привет из 2018! Работает ваш плагин на новостном сайте, есть некоторая проблема вот с чем:
                      на сайте реализован переброс записей из полного оформления в AMP. Во-первых, согласно вашему снипету происходит замена "<a", но следует менять "<a "(с пробелом) так как тег <amp-img… ошибочно заменяется. что касается замены тегов ссылок — в AMP по стандарту не поддерживаются свойства тега . На данный момент я сделал заглушку через replace, но хотел спросить, как изменить код плагина для того, чтобы он запускался на всех страницах, кроме тех. в адресе которых есть, например, "../amp/...". Прошу простить мою безграмотность — я не работаю с php)
                        Марат Марабар
                        10 августа 2018, 16:38
                        0
                        В этом плагине проставить пробелыить пробелы

                        Кусок кода заменить на этот
                        if ((boolean)$extLinkRedirector->config['add_blank']) {
                            $link = preg_replace('/target=["\'][^\'".]+["\']/', '', $link);
                            $link = str_replace('<a ','<a target="_blank" ',$link);
                        }
                        if ((boolean)$extLinkRedirector->config['add_nofollow']) {
                            $link = preg_replace('/rel=["\'][^\'".]+["\']/', '', $link);
                            $link = str_replace('<a ','<a rel="nofollow" ',$link);
                        }
                        if ((boolean)$extLinkRedirector->config['add_noindex']) {
                            $link = str_replace('</a>','</a><!--/noindex-->',$link);
                            $link = str_replace('<a ','<!--noindex--><a ',$link);
                        }
                          Bress
                          10 августа 2018, 17:02
                          0
                          Это было сделано сразу. Вы не прочли мою строку о том, что «в AMP по стандарту не поддерживаются свойства тега ». Любые rel и target не валидны для AMP. Потому мне необходимо именно не применять плагин на страницах с "/amp/" в URL
                        Антон Пархоменко
                        31 августа 2022, 11:30
                        0
                        Доброго дня.
                        При сканировании одного из своих сайтов на уязвимость, я обнаружил, что использование данного плагина открывает возможность к sql-инъекции.
                          Андрей
                          20 ноября 2023, 12:23
                          0
                          Здравствуйте! планируется ли апдейт данного плагина, например, для защиты от несанкционированного использования? Сейчас плагин делает открытый редирект, который могут использовать спамеры чтобы закинуть кучу ссылок в поисковики, используя ваш сайт.
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                            39