Как «спрятать» внешние ссылки. Небольшой PHP скрипт

Владимир | | htaccess, PHP, SEO.

Маскировка ссылок

Эта статья об одном из довольно распространенных способов маскировки внешних ссылок (по-английски – link cloaking).

Работает link cloaking следующим образом. Просматривая страницу, посетитель видит обычную внутреннюю ссылку. Но, после перехода по ней – попадает на другой сайт.

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

Идея заключается в использовании редиректа и реализуется в два этапа:

1) в корне сайта (папка, на которую указывает DOCUMENT_ROOT) создаем папку с именем pages.

2) в этой папке размещаем три файла:

linkslist.php – в нем будет массив с внешними ссылками;
redirect.php – анализирует ссылку по которой был выполнен переход и отправляет посетителя на внешний ресурс;
.htaccess – передает все запросы скрипту redirect.php.

Принцип работы

На страницах сайта вы размещаете ссылки вида: http://site_name/pages/get/вторая_часть_адреса, где вторая_часть_адреса – может быть чем угодно, например, mypage.html или page1 и т.д. Тут все зависит от вашей фантазии.

Преобразование адреса происходит следующим образом. При любом переходе по ссылке вида http://site_name/pages/get/......... к ней будут применены правила из .htaccess.

Примечание. На сервере должен быть установлен и запущен apache mod_rewrite.

С помощью правил в этом файле, мы заменяем в адресе get на redirect.php. Т.е. получится:
http://site_name/pages/redirect.php/вторая_часть_адреса

Скрипт redirect.php по второй части адрса выбирает внешнюю ссылку и отправляет браузеру redirect.

Описанный порядок преобразования адресов изображен на диаграмме.

Маскировка ссылок

Теперь рассмотрим сами скрипты

linkslist.php

<?php
$linksList = array(
    'page1.html' => 'http://www.google.com',
    'page2.html' => 'http://www.php.net'
);
?>

Здесь объявлен обычный массив. Ключом элемента является вторая часть адреса внутренней ссылки, а значением – адрес внешнего ресурса.

redirect.php

<?php
require_once('linkslist.php');

$request = $_SERVER['REQUEST_URI'];
$dest = explode('/', $request);
$newUrlKey = end($dest);

if (array_key_exists($newUrlKey, $linksList)) {
    header('Location:'.$linksList[$newUrlKey]);
}
else {
    header('Location:http://www.simplecoding.org');
}
?>

Здесь мы подключаем файл с массивом ссылок (строка 2). После этого выделяем из адреса вторую часть (строки 5, 6) и формируем заголовок с редиректом (строки 8-13).

.htaccess

<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^get/(.+) /pages/redirect.php/$1 [L]
</IfModule>

В этом файле мы создали правило, которое меняет get на redirect.php в адресе.

Заключение

На сегодняшний день существует несколько готовых решений, которые выполняют эти же функции (например, плагины для WordPress вроде Hidden Affiliate Links).

Самое главное, перед тем как использовать описанный в этой статье метод, вы должны четко понимать, что вам даст маскировка ссылок.

Ведь, по большому, счету маскировка ссылок очень напоминает обман посетителя. Или у вас другое мнение?

  • Sam

    А ваедь и правда… зачем?

  • Sam

    А ваедь и правда… зачем?

  • Полностью согласен с последним абзацем. Тысячу раз проклинал Хабр за то, что они «прячут» реальные ссылки. жутко неудобно. где-то видел способ оформить внешние сылки. нечто вроде :after элемента…

  • Полностью согласен с последним абзацем. Тысячу раз проклинал Хабр за то, что они «прячут» реальные ссылки. жутко неудобно. где-то видел способ оформить внешние сылки. нечто вроде :after элемента…

  • Для WordPress я свой плагинчик рисовал. Называется RC Link Redirector лежит тут http://www.chanishvili.org/rc-redirector/

    Был сделан чтобы прятать рефовые линки и не давать ссылок ЧМОшникам-говнокоментаторам.

    • чтобы прятать рефовые линки

      Спасибо, я как-то об этом не подумал.

    • Против чмошников можно попоробовать плагин от Алексея Новикова 🙂
      А вот прятать вненнюю ссылку _всегда_ — не вижу смысла.
      Некоторые плагины (тот же snap)я прикрутил к _внешним_ ссылкам — так зачем мне их прятать?
      И многие ссылки в моих статьях — тоже прямые и внешние. Мне не жалко.

  • Для WordPress я свой плагинчик рисовал. Называется RC Link Redirector лежит тут http://www.chanishvili.org/rc-redirector/

    Был сделан чтобы прятать рефовые линки и не давать ссылок ЧМОшникам-говнокоментаторам.

    • чтобы прятать рефовые линки

      Спасибо, я как-то об этом не подумал.

    • Против чмошников можно попоробовать плагин от Алексея Новикова 🙂
      А вот прятать вненнюю ссылку _всегда_ — не вижу смысла.
      Некоторые плагины (тот же snap)я прикрутил к _внешним_ ссылкам — так зачем мне их прятать?
      И многие ссылки в моих статьях — тоже прямые и внешние. Мне не жалко.

  • По-поводу реф. ссылок.
    Может если их спрятать, то переходов будет и больше, но ведь посетитель сразу увидит, что попал куда-то не туда. А лично у меня такие переходы вызывают только раздражение (особенно когда я ничего покупать не собираюсь 🙂 ).

    Кроме того, интересный вопрос — реакция поисковиков. Ведь для них определить что ссылка внешняя не составит труда.
    Как вариант, можно для них установить noindex, nofollow, чтобы поисковик их просто проигнорировал.

    • определенно согласен. noindex — хороший вариант

      • К сожалению noindex не соответствует веб-стандартам w3c если находится не в мета-теге. а в теле страницы. а если ставить в мета-тег, то вся страница выпадает из индексации.

        • Есть решение этой проблемы

          <del class="hide"><![CDATA[<noindex>]]></del>
          ссылки
          <del class="hide"><![CDATA[</noindex>]]></del>

        • Спасибо.
          Я в программировании абсолютный ноль, не подскажите где можно почитать внятно по теме, так как из поста не особенно понял. Заранее спасибо. Мой адрес на mail.ru просто cczy

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

        • Добрый вечер!

          Большое спасибо за ответ.
          Кое-какие базовые данные у меня есть, но их явно недостаточно.
          Я хотел на сайте поставить кнопочки счётчиков через редирект или скрипт. Не могли бы вы посоветовать какой-нибудь шаблон для этого, где можно обойтись без знания программирования, а просто заменить в шаблоне данные на свои?
          Извините, если сильно напрягаю с вопросами.

          Владимир Никольский

          THKS n BRGDS
          Capt. Vlad Nikolskiy,
          Master Mariner.
          http://cczy.ru/ — my personal marine site
          http://cczy.blog.ru/ — my marine blog
          http://elthon.narod.ru/ — my poodle's site
          Ph: +7-8617-712472
          Mob: +7-905 43 82 218
          Skype with WEB cam — captcczy

          Fri, 19 Nov 2010 14:20:10 -0000 письмо от «Disqus» :

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

          Будет проще, если вы напишите какой именно счетчик хотите поставить.

        • Уважаемый Владимир,

          большое спасибо, что нашли время ответить на мои делетантские вопросы. Чтобы сократить время, гляньте пожалуйста — http://cczy.ru/
          и вы поймёте какие счётчики у меня стоят. Возможно ли «замаскировать» их таким образом, чтобы с главной страницы сайта не было исходящих ссылок?
          Ещё раз спасибо.

          Владимир Никольский.

          THKS n BRGDS
          Capt. Vlad Nikolskiy,
          Master Mariner.
          http://cczy.ru/ — my personal marine site
          http://cczy.blog.ru/ — my marine blog
          http://elthon.narod.ru/ — my poodle's site
          Ph: +7-8617-712472
          Mob: +7-905 43 82 218
          Skype with WEB cam — captcczy

          Sun, 21 Nov 2010 14:19:39 -0000 письмо от «Disqus» :

        • Теперь ясно. Разметка счетчиков формируется кодом, который вы вставляете на страницу. Этот код либо уже содержит ссылку, либо ссылка формируется с помощью JS скрипта (HotLog). Выглядят они примерно так:
          http://click.hotlog.ru/?449510
          Вы можете заменить эту ссылку на нужную вам и дальше использовать метод, описанный в статье. Но не забывайте, что это — нарушение лицензии и я не уверен, что все счетчики при этом будут правильно работать (нужно проверять).

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

  • По-поводу реф. ссылок.
    Может если их спрятать, то переходов будет и больше, но ведь посетитель сразу увидит, что попал куда-то не туда. А лично у меня такие переходы вызывают только раздражение (особенно когда я ничего покупать не собираюсь 🙂 ).

    Кроме того, интересный вопрос — реакция поисковиков. Ведь для них определить что ссылка внешняя не составит труда.
    Как вариант, можно для них установить noindex, nofollow, чтобы поисковик их просто проигнорировал.

    • определенно согласен. noindex — хороший вариант

      • К сожалению noindex не соответствует веб-стандартам w3c если находится не в мета-теге. а в теле страницы. а если ставить в мета-тег, то вся страница выпадает из индексации.

        • Есть решение этой проблемы

          <del class="hide"><![CDATA[<noindex>]]></del>
          ссылки
          <del class="hide"><![CDATA[</noindex>]]></del>

  • Может, стоит добавить еще и эту строчку.
    Header( «HTTP/1.1 301 Moved Permanently» );

    • Кстати, да. Поисковикам должно понравится 🙂
      Насколько я знаю, 301 редирект — это единственный надежный способ гарантировать, что страница попадет в индекс с новым адресом.

  • Может, стоит добавить еще и эту строчку.
    Header( «HTTP/1.1 301 Moved Permanently» );

    • Кстати, да. Поисковикам должно понравится 🙂
      Насколько я знаю, 301 редирект — это единственный надежный способ гарантировать, что страница попадет в индекс с новым адресом.

  • Kate

    Спасибо, все отлично получилось.
    Повесила на скрипт статистику скачки файлов.

  • Kate

    Спасибо, все отлично получилось.
    Повесила на скрипт статистику скачки файлов.

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

    • Что именно не получается?
      Как выглядят ссылки?
      На странице вам нужно разместить скрытую ссылку, после этого занести прямые (партнерские) ссылки в массив.

      Небольшой совет. Установите плагин Live HTTP Headers для FireFox. Он позволяет просматривать HTTP заголовки. Это поможет определить проблему. Нужно выяснить, отправляет сервер rederect или нет.

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

    • Что именно не получается?
      Как выглядят ссылки?
      На странице вам нужно разместить скрытую ссылку, после этого занести прямые (партнерские) ссылки в массив.

      Небольшой совет. Установите плагин Live HTTP Headers для FireFox. Он позволяет просматривать HTTP заголовки. Это поможет определить проблему. Нужно выяснить, отправляет сервер rederect или нет.

  • Владимир, Вы странный способ используете.
    Конечно, немного рекламы: как сделать редирект ссылок.

    Статья моя. ИМХО, я предлагаю более простой и понятный способ. Для поисковиков оба способа выглядят одинаково — в конце редирект.

    Единственный минус у моего варианта — не прокатывают URL'ы с эмпирсендом (&). Помощь в решении этого вопроса приветствуется 😉 Думаю, тогда будет идеальный и быстрый способ.

    • Сразу хочу уточнить. Вы прячете ссылку только от поисковиков, посетитель по ее виду сможет определить что ссылка внешняя. Достоинство это или недостаток — вопрос другой.
      Кстати если вы хотите продавать ссылки через биржи вроде sape, то можете просто использовать теги . Внешние ссылки внутри этих тегов учитываться не будут.

      По-поводу &. Вариант в вашей статье (замена на %26) по-моему вполне нормальный. Но если нужно автоматизировать процесс, можно использовать php функцию urlencode(). Наверное, лучше всего написать плагин, который будет выполнять обработку всех адресов при сохранении или публикации поста.

    • Наверное, лучше будет использовать rawurlencode(), т.к. в отличие от urlencode() она преобразует пробел в «%20», а не «+».

  • Владимир, Вы странный способ используете.
    Конечно, немного рекламы: как сделать редирект ссылок.

    Статья моя. ИМХО, я предлагаю более простой и понятный способ. Для поисковиков оба способа выглядят одинаково — в конце редирект.

    Единственный минус у моего варианта — не прокатывают URL'ы с эмпирсендом (&). Помощь в решении этого вопроса приветствуется 😉 Думаю, тогда будет идеальный и быстрый способ.

    • Сразу хочу уточнить. Вы прячете ссылку только от поисковиков, посетитель по ее виду сможет определить что ссылка внешняя. Достоинство это или недостаток — вопрос другой.
      Кстати если вы хотите продавать ссылки через биржи вроде sape, то можете просто использовать теги . Внешние ссылки внутри этих тегов учитываться не будут.

      По-поводу &. Вариант в вашей статье (замена на %26) по-моему вполне нормальный. Но если нужно автоматизировать процесс, можно использовать php функцию urlencode(). Наверное, лучше всего написать плагин, который будет выполнять обработку всех адресов при сохранении или публикации поста.

    • Наверное, лучше будет использовать rawurlencode(), т.к. в отличие от urlencode() она преобразует пробел в «%20», а не «+».

  • sonik

    Немножко не в тему, нашол тут сайтик.
    Сервис маскировки URL

    http://hider.org.ua/

    • По моему он не совсем рабочий 😉 Ввести URL в поле я не смог.

  • sonik

    Немножко не в тему, нашол тут сайтик.
    Сервис маскировки URL

    http://hider.org.ua/

    • По моему он не совсем рабочий 😉 Ввести URL в поле я не смог.

  • sonik

    Ну незнаю, у меня всё получилось. 🙂

    • Поправка, не работает при использовании FireFox3.0.3. В Opera 9.61 все нормально 😉 .

  • sonik

    Ну незнаю, у меня всё получилось. 🙂

    • Поправка, не работает при использовании FireFox3.0.3. В Opera 9.61 все нормально 😉 .

  • Nothing

    Тема ещё актуальна? Не подскажете, как сделать чтобы редирект вел сначала на страницу с реклмой, в центре которой была бы кнопка «перейти на «нужный сайт»» Не хочу сайт заваливать банерами, уж лучше такую страничку.

    Если можно ответьте на мэйл yakrivetka(собака)mail(точка ру)

    • Можно сделать так.
      1) Создаем страницу с рекламой adv.php
      В ней должен быть примерно следующий код:
      if (isValid($_GET['rp'])) {
      //переход на запрошенную страницу
      echo '<a href=»'.$rp.'»>…</a>');
      } else {
      //переход на главную
      echo '<a href=»http://www.simplecoding.org»>…</a>');
      }
      Функция isValid должна проверять полученный параметр.

      2) В файле redirect.php формируем редирект следующим образом
      header('Location:http://www.simplecoding.org/adv.php?rp='.$url);

      //$url — адрес запрашиваемой страницы

      Т.е. идея в том, что мы перенаправляем посетителя на страницу adv.php и адрес запрошенной страницы указываем в GET параметре. После этого читаем значение из GET параметра и формируем на его основе ссылку.

      • У меня сайт на mediawiki, очень много внешних ссылок, и видимо как результат — не смотря на ссылающиеся на меня около 1000 сайтов ТИЦ=10, PR=1

        Нужен скрипт редиректа, в котором можно будет задавать URL перехода в самой ссылке, вида site.ru/links.php?url=www.simplecoding.org

        а сам links.php можно и в robots.txt запретить

        Заранее спасибо 🙂

        • Вы можете использовать скрипт из этой статьи, только вместо
          $dest = explode('/', $request);
          получить url из массива $_GET
          $dest = $_GET['url'];
          Строки
          $newUrlKey = end($dest);
          и
          if (array_key_exists($newUrlKey, $linksList)) {
          тоже убираете, а редирект будет выполняться так:
          header('Location:'.$dest);

        • Я надеюсь, вы добавите проверку полученного url 😉

  • Nothing

    Тема ещё актуальна? Не подскажете, как сделать чтобы редирект вел сначала на страницу с реклмой, в центре которой была бы кнопка «перейти на «нужный сайт»» Не хочу сайт заваливать банерами, уж лучше такую страничку.

    Если можно ответьте на мэйл yakrivetka(собака)mail(точка ру)

    • Можно сделать так.
      1) Создаем страницу с рекламой adv.php
      В ней должен быть примерно следующий код:
      if (isValid($_GET['rp'])) {
      //переход на запрошенную страницу
      echo '<a href=»'.$rp.'»>…</a>');
      } else {
      //переход на главную
      echo '<a href=»http://www.simplecoding.org»>…</a>');
      }
      Функция isValid должна проверять полученный параметр.

      2) В файле redirect.php формируем редирект следующим образом
      header('Location:http://www.simplecoding.org/adv.php?rp='.$url);

      //$url — адрес запрашиваемой страницы

      Т.е. идея в том, что мы перенаправляем посетителя на страницу adv.php и адрес запрошенной страницы указываем в GET параметре. После этого читаем значение из GET параметра и формируем на его основе ссылку.

      • У меня сайт на mediawiki, очень много внешних ссылок, и видимо как результат — не смотря на ссылающиеся на меня около 1000 сайтов ТИЦ=10, PR=1

        Нужен скрипт редиректа, в котором можно будет задавать URL перехода в самой ссылке, вида site.ru/links.php?url=www.simplecoding.org

        а сам links.php можно и в robots.txt запретить

        Заранее спасибо 🙂

        • Вы можете использовать скрипт из этой статьи, только вместо
          $dest = explode('/', $request);
          получить url из массива $_GET
          $dest = $_GET['url'];
          Строки
          $newUrlKey = end($dest);
          и
          if (array_key_exists($newUrlKey, $linksList)) {
          тоже убираете, а редирект будет выполняться так:
          header('Location:'.$dest);

        • Я надеюсь, вы добавите проверку полученного url 😉

  • Не надо прятать все ссылки, а только реф. ссылки, что бы ID не обрезали

    • Для этого придется делать фильтр, который будет искать реф. ссылки.
      Лучше всего, если он будет переделывать ссылки при сохранении статьи. Но это отдельная тема.

  • Не надо прятать все ссылки, а только реф. ссылки, что бы ID не обрезали

    • Для этого придется делать фильтр, который будет искать реф. ссылки.
      Лучше всего, если он будет переделывать ссылки при сохранении статьи. Но это отдельная тема.

  • Вот собрал все, но работать не хочет, с пхп не очень у меня, немогли бы вы посмотереть где допустил ошибку, буду очень признателен.

    тестируб на денвере пхп4, да и на ftp пробывал
    http://samiro.ru/up/redirect-script.rar

    • Ссылка, по которой вы переходите в index.html выглядит так:
      href=»/pages/get/ref»

      Каким образом управление будет попадет к redirect.php?

      Если вы ее измените на
      href=»redirect.php/pages/get/ref»
      будет значительно лучше 😉

      • А скажите чем плох такой вариант?

        Redirect permanent /test http://www.test.com/

        меньше кода, но в обоих случиях все руками

        • А и еще) если запретить через robots все линки с redirect.php это же сработает? И как бы это написать чтобы от всего роботов не отпугнуть?)

        • а даже так
          Redirect 301 /test http://www.test.com/
          чтобы оставить PR?

        • Дело не в том, что какой-то вариант плох, а какой-то хорош. Главное — что вы хотите получить?

          Если у вас 1-2 ссылки, то можете делать как угодно (с помощью php скрипта или файла htaccess, как вы предложили).

          Но если у вас больше 100 ссылок, то переписывать их вручную — занятие не самое приятное.

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

          Тогда вам не нужно будет заполнять массив со ссылками вручную — вы получите их из базы.

          При этом если используется php скрипт, то получение ссылок выполняется элементарно. А если вы будете использовать htaccess, то придется писать отдельный скрипт, который будет перезаписывать список ссылок в этом файле.

          Файл robots.txt вообще не влияет на работу скриптов. В нем записываются рекомендации поисковикам. На самом деле с его помощью закрыть доступ ни к чему нельзя.

  • Вот собрал все, но работать не хочет, с пхп не очень у меня, немогли бы вы посмотереть где допустил ошибку, буду очень признателен.

    тестируб на денвере пхп4, да и на ftp пробывал
    http://samiro.ru/up/redirect-script.rar

    • Ссылка, по которой вы переходите в index.html выглядит так:
      href=»/pages/get/ref»

      Каким образом управление будет попадет к redirect.php?

      Если вы ее измените на
      href=»redirect.php/pages/get/ref»
      будет значительно лучше 😉

      • А скажите чем плох такой вариант?

        Redirect permanent /test http://www.test.com/

        меньше кода, но в обоих случиях все руками

        • А и еще) если запретить через robots все линки с redirect.php это же сработает? И как бы это написать чтобы от всего роботов не отпугнуть?)

        • а даже так
          Redirect 301 /test http://www.test.com/
          чтобы оставить PR?

        • Дело не в том, что какой-то вариант плох, а какой-то хорош. Главное — что вы хотите получить?

          Если у вас 1-2 ссылки, то можете делать как угодно (с помощью php скрипта или файла htaccess, как вы предложили).

          Но если у вас больше 100 ссылок, то переписывать их вручную — занятие не самое приятное.

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

          Тогда вам не нужно будет заполнять массив со ссылками вручную — вы получите их из базы.

          При этом если используется php скрипт, то получение ссылок выполняется элементарно. А если вы будете использовать htaccess, то придется писать отдельный скрипт, который будет перезаписывать список ссылок в этом файле.

          Файл robots.txt вообще не влияет на работу скриптов. В нем записываются рекомендации поисковикам. На самом деле с его помощью закрыть доступ ни к чему нельзя.

  • а вот не хочет работать редирект при наличии таких правил

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^(.*) $1 [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?category=$1 [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([a-z_]+)/([^/]+) index.php?category=$1&title=$2 [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([a-z_]+)/([^/]+)/([^/]+)/ index.php?category=$1&title=$2&commentspage=$3 [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([a-z0-9_-]+)/([0-9]+)/ index.php?category=$1 articlespage=$2 [L]

    скорее всего из за первых двух строк, неподскажите что исправить в вашем?

    RewriteRule ^get/(.+) /redirect.php/$1 [L]

    • Зачем угадывать?
      Уберите все правила и добавляйте по одному. Сразу узнаете в какой строке проблема.
      Мне сложно что-то посоветовать, т.к. я не знаю, что вы хотите сделать 😉

    • Кроме того, часто полезно посмотреть что выводится в логах.
      Включается так
      RewriteLog «/path_to_log/rewrite.log»
      RewriteLogLevel 3

  • а вот не хочет работать редирект при наличии таких правил

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteRule ^(.*) $1 [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?category=$1 [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([a-z_]+)/([^/]+) index.php?category=$1&title=$2 [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([a-z_]+)/([^/]+)/([^/]+)/ index.php?category=$1&title=$2&commentspage=$3 [L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([a-z0-9_-]+)/([0-9]+)/ index.php?category=$1 articlespage=$2 [L]

    скорее всего из за первых двух строк, неподскажите что исправить в вашем?

    RewriteRule ^get/(.+) /redirect.php/$1 [L]

    • Зачем угадывать?
      Уберите все правила и добавляйте по одному. Сразу узнаете в какой строке проблема.
      Мне сложно что-то посоветовать, т.к. я не знаю, что вы хотите сделать 😉

    • Кроме того, часто полезно посмотреть что выводится в логах.
      Включается так
      RewriteLog «/path_to_log/rewrite.log»
      RewriteLogLevel 3

  • Спасибо за статью, в след. версии сайта, обязательно сделаем дружелюбные ссылки 🙂

  • Спасибо за статью, в след. версии сайта, обязательно сделаем дружелюбные ссылки 🙂

  • Владимир, скажите, пожалуйста, какую проверку передаваемых параметров нужно делать? Какие возможные уязвимости у редиректа через глобальный массив $_GET?

    • Дело в том, что в примере, который я показан в статье, проверка параметров есть. Если полученный параметр не соответствует ни одному из элементов массива $linksList, то редирект будет выполнен на главную страницу сайта.

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

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

    • Djhbasc

      Посетите сайт http://sy4ek.ru/

  • Владимир, скажите, пожалуйста, какую проверку передаваемых параметров нужно делать? Какие возможные уязвимости у редиректа через глобальный массив $_GET?

    • Дело в том, что в примере, который я показан в статье, проверка параметров есть. Если полученный параметр не соответствует ни одному из элементов массива $linksList, то редирект будет выполнен на главную страницу сайта.

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

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

  • businessuspeh

    в какой файл это вставлять?

  • В redirect.php перед строкой 9.

  • Alex

    подскажите, как сделать чтобы редирект выглядел след образом:

    у нас есть site.com
    нам надо поставить ссылку на google.com

    как сделать чтобы линки выглядел
    http://site.com/foldername/go-google.html

    ?

    заранее благодарю

  • В этом случае вам придется использовать .htaccess. Т.к. для файлов с расширением html интерпритатор php вызываться не будет (это можно изменить в конфиге апача httpd.conf).

    В простейшем случае редирект в .htaccess выглядит так:
    Redirect /foldername/go-google.html http://google.com

  • Alex

    то есть, просто добавить в хтаксес строку вида
    Redirect /что-захочу.html http://google.com ??

    подозрительно просто)

  • Просто попробуйте 🙂

  • Pingback: PHP редирект внешних ссылок и скрытие реферальных ссылок :: Tod’s Blog()

  • Fimka Home

    Можно просто воспользоваться сервисами коротких ссылок!!! там можно альясы создавать, чтобы в конце ссылки не было кракозябр…

    • Можно, но иногда не хочется зависеть от них. К тому же ссылка получится внешней.

  • Shkur

    Мысль очень даже не плоха. Я вычитал что если ссылаешся на тематические сайты то это даёт некий плюс. Это я к тому что не все ссылки надо скрывать. Ну а если например у меня прайс-лист и там более 100 внешних ссылок? Вот тут эти методы и нужны.
    Я сперва нашел этот

    написал javascript чтоб ссылки были нормальные когда на них наводишь мышку. Можете почитать тут http://javascript.ru/blog/shkur/skryt-vneshnie-ssylki-s-sajta
    в действии тут http://shkur.ru/base64

    Как быть с безопасностью — чтобы url.php не принимал запросы с сторонних ресурсов — чтобы другие сайты не могли его использовать???

    • Можно проверить заголовок Referer. Но это не 100% метод защиты.
      Второй вариант — обрабатывать только те ссылки, которые предварительно добавлены в БД.

      • Да, я тоже об этом думал, но его можно подделать. Это не 100% гарантия. Тут действительно база нужна, а все никак не доползу до полноценной CMS 🙂 ленивый видать…
        Ну и вобщем тут после очередного потраченного дня я вдруг понял, что если кто-то будет ставить ссылку на скрипт на моём сайте — так это только плюс! 🙂 Лишняя входящая внешняя (если можно так выразиться) ссылка лишней не будет. А накладные расходы от такого скрипта не велики…я надеюсь…

        • Расходы действительно не велики. Запросов к БД нет, страницу формировать не нужно, только заголовок отправить.
          Если кто-то захочет организовать DoS на ваш сайт, то врядли выберет этот скрипт в качестве цели 🙂

  • Доброго времени суток, админ. Искал в яндексе нужную мне информацию и нашел вашу статью. Вопрос такой. У меня есть сайт, контент выводится с помощью echo (на пхп написан),как сделать так чтобы перед выводом ссылки (они создаются непосредественно перед выводом, т.е. динамически) разных видов (например, site1.com/page1/ex, site2.ru/krechet/name.html и так несколько) менялись на свои ,вида http://www.мой_сайт.ru/link234 .

    То есть описанный у вас в статье способ мне не подходит, ибо у меня ссылки динамические — каждый раз — новый адрес — на внешний ресурс!!!

    • Существует однозначное соответствие между внешней ссылкой и внутренней или нет?
      Если нет, то я не представляю что можно сделать.
      Если да, то в linkslist.php нужно из базы получить адрес внешней ссылки.

  • Mav1creator

    Вопросик такой — на сайте ссылки вида http://site1.ru/razdel/pages/1.html
    мне надо чтобы с помощью файла .htaccess получались при нажатии на них (на ссылки), пользователь отправлялся на http://site2.ru/razdel/pages/1.html

    То есть «хвост» ссылки одинаковый, разница лишь в site1 и сайт 2.

    вот такие ссылки у меня:

    javascript:openwindow(«http://site1.ru/index.php?option=com_lsh&view=lsh&event_id=25819&tid=17424&channel=0&tmpl=component&layout=popup»,»580",»530")

    а надо чтобы при нажатии на ссылку было:

    javascript:openwindow(«http://site2.ru/index.php?option=com_lsh&view=lsh&event_id=25819&tid=17424&channel=0&tmpl=component&layout=popup»,»580",»530")

    Плиз, подскажите какой должен быть .htaccess…

    • Наверное, как-то так

      RewriteRule ^(.*)site1.ru(.*)$ $1site2.ru$2

      Не проверял.

  • Zhanna

    Угу, обман посетителя. А ничего, что посетитель обманет своего реферёра и обрежет хвостик ссылки? Реферёры, между прочим, столько времени тратят на то, чтобы привлечить этих самых посетителей.

  • Честно говоря, я бы не стал пользоваться таким методом. Подмена адреса с помощью JS выглядит как-то совсем по спамерски 🙂

  • black spa

    Очень познавательно, спасибо большое

  • Rrr

    Обман не обман, кто знает, …. вот в коде присутствует  e l s e {
        header('Location:http://www.simplecoding.org');
    } —
    Это обман или нет ?))

  • Answers

    Спасиб конечно, вот пробую … и вот что получилось http://dieta.uhostall.com/principy-diet.php

  • Answers

    dieta.uhostall.com

  • Саша

    Скажите, не будет ли утекать вес страницы при таких редиректах?

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

    • Да, будет. Ссылка есть ссылка 🙂
      Используйте noindex.

  • Вячеслав Мебель

    Ещё актуально вопрос задать? Не работает редирект, выдает вот такую ошибку:

    Parse error: syntax error, unexpected '$request' (T_VARIABLE) in site/public_html/pages/redirect.php on line 4

    • Вы случайно не пропустили точку с запятой в предыдущей строке?

      • Вячеслав Мебель

        Я так понимаю Вы говорите о файле redirect.php ? Если да, то предыдущая строка, то есть третья, у меня вообще пустая, как и у Вас, а вот во второй строке точка с запятой стоит require_once('linkslist.php'); всё копировал в точности.

  • surikat

    Здравствуйте. А если у меня допустим в исходном коде ссылка на субтитры для плеера простого вида http://site.ru/bob/file.vtt и надо сделать так чтобы посетитель открыв эту ссылку не смог её скачать или просмотреть в браузере, а был бы переправлен на пустую страницы. А плеер чтобы смог и дальше читать .vtt файл ? Возможно ли это сделать с помощью php ?

    • Если пользователь умеет пользоваться инструментами для анализа трафика, то нет, не получится. Вы сможете сильно усложнить такому пользователю задачу если напишите не стандартный плеер, который каким-то образом будет авторизоваться на сервере. Или используете не стандартный формат видео, который понимает только Ваш плеер.

  • surikat

    Здравствуйте. А если у меня допустим в исходном коде ссылка на субтитры для плеера простого вида http://site.ru/bob/file.vtt
    и надо сделать так чтобы посетитель открыв эту ссылку не смог её
    скачать или просмотреть в браузере, а был бы переправлен на пустую
    страницу. А плеер чтобы смог и дальше читать .vtt файл ? Возможно ли
    это сделать с помощью php ?