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

Плагин срабатывает на пререндер страницы, отлавливает все внешние ссылки, и, в зависимости от настроек, делает редирект через внутреннюю страницу, добавляет 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
11 419

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

Виталий Барышников
16 февраля 2016, 14:24
Здравствуйте. Не пойму как его поставить. Загрузил транспорт.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
    Доброго дня. Может быть проблема с правами? На modhost тестовом только что проверил. Да и у меня на 3 сайтах без проблем установилось.



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

        Кирилл
        17 февраля 2016, 13:38
        По этим параметрам исключаются внешние ссылки, которые не должны обрабатываться плагином. Допустим, ссылки на 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
          А вот эта (stop_words) фишка наиумнейшая))!!! Для мультидоменных сайтов просто must have!
          Вопроос: В репозитарии хоть каком то планируется размещение пакета? Да, ставить секунды, но если из репозитария — удобнее же)
      Роман Воропаев (Volk)
      19 февраля 2016, 09:19
      Есть небольшая особенность в этом компоненте, если мы пишем стоп слова, то они чувствительны к регистру. Т.е. если напишем в стоп слова site.ru а сама ссылка на сайте будет Site.ru, то исключение не сработает, и нужно в стоп словах прописать site.ru,Site.ru
        Кирилл
        19 февраля 2016, 09:41
        Странно, у меня регистр не имеет значения. Посмотрим, может кто еще отпишется по поводу этой проблемы, сделаем немного по другому. Сейчас вот таким образом проверка идет:

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

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

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

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

          Ссылка	s4737.h2.modhost.pro/manager/
          Логин	s4737
          Пароль	I03qKiPI5gGQ
            Борода
            13 марта 2016, 16:47
            И у меня пропала. Я сайт на https перевёл. Может из-за этого было. Кеш или ещё чего там…
            Благодарю за обратную связь.
          Виталий Барышников
          26 апреля 2016, 06:57
          Привет. Не работает с ссылками, в которых есть другие блоки, мой пример:
          <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
            Самое простое — написать весь этот код в одну строку:

            <a href="http://site1.ru/"><img src="[[++rb_base_dir]]img/logo1.png" alt="Лого1"/><span>Ссылка 1</span></a>
          Александр
          04 августа 2016, 20:52
          Спасибо за компонент!
          Было бы здорово ещё добавить возможность устанавливать задержку в миллисекундах )
            Кирилл
            05 августа 2016, 07:47
            А зачем эта задержка? Что-то даже прикинуть не могу, какая от этого может быть польза.
              Александр
              05 августа 2016, 15:15
              Ну например, баннер рекламный воткнуть какой-нибудь ) или предупреждение, что внешняя ссылка может вести на сайт с вредоносным кодом, предложить не уходить с сайта.
                Кирилл
                11 августа 2016, 14:02
                Замени сниппет 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
                  Спасибо, как раз то что нужно! )
                Дмитрий Иванов
                05 августа 2016, 18:23
                В чем проблема сделать это самому на странице указанной в redirect_page_id? это же элементарщина
                  Konstantin
                  11 августа 2016, 13:45
                  наверное сложность в том что с этой страницы он не задерживаясь редиректит, а нужно чтобы тыкали или через определенное время автоматом переходило )
                    Дмитрий Иванов
                    11 августа 2016, 13:49
                    А если убрать оттуда сниппет и сделать js редирект с какой нужно задержкой?
              Борис И
              04 февраля 2017, 11:15
              Оличное решение, спасибо.
                varanika
                21 марта 2017, 19:39
                Вот и у меня что-то не так идет. В верху сайта есть:
                <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
                  Не видя сайта, не смогу помочь. Отправьте ссылку на почту, в профиле кнопка.
                  Или, если проблема только с этой ссылкой, можете использовать «stop_classnames».
                  digorev
                  23 апреля 2017, 00:01
                  Ребята, а что делать если плагин успешно добавляет nofollow и blank но совсем не реагирует на настройки, да и ссылки не преобразовывает? ( Я уже пробовал по-всякому, ничего не получается
                    Кирилл
                    23 апреля 2017, 09:05
                    На какие настройки не реагирует? Опишите проблему подробнее, желательно с примерами.
                    Bress
                    10 августа 2018, 15:10
                    Привет из 2018! Работает ваш плагин на новостном сайте, есть некоторая проблема вот с чем:
                    на сайте реализован переброс записей из полного оформления в AMP. Во-первых, согласно вашему снипету происходит замена "<a", но следует менять "<a "(с пробелом) так как тег <amp-img… ошибочно заменяется. что касается замены тегов ссылок — в AMP по стандарту не поддерживаются свойства тега . На данный момент я сделал заглушку через replace, но хотел спросить, как изменить код плагина для того, чтобы он запускался на всех страницах, кроме тех. в адресе которых есть, например, "../amp/...". Прошу простить мою безграмотность — я не работаю с php)
                      Марат Марабар
                      10 августа 2018, 16:38
                      В этом плагине проставить пробелыить пробелы

                      Кусок кода заменить на этот
                      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
                        Это было сделано сразу. Вы не прочли мою строку о том, что «в AMP по стандарту не поддерживаются свойства тега ». Любые rel и target не валидны для AMP. Потому мне необходимо именно не применять плагин на страницах с "/amp/" в URL
                      Антон Пархоменко
                      31 августа 2022, 11:30
                      Доброго дня.
                      При сканировании одного из своих сайтов на уязвимость, я обнаружил, что использование данного плагина открывает возможность к sql-инъекции.
                        Андрей
                        20 ноября 2023, 12:23
                        Здравствуйте! планируется ли апдейт данного плагина, например, для защиты от несанкционированного использования? Сейчас плагин делает открытый редирект, который могут использовать спамеры чтобы закинуть кучу ссылок в поисковики, используя ваш сайт.
                          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                          39