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

12 апреля, 2008

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

Эта статья об одном из довольно распространенных способов маскировки внешних ссылок (по-английски – 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).

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

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

Понравилась статья? Подписывайтесь на продолжение rss link !

Или на мой твиттер twitter link

]]>

Добавьте эту страницу в google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru

]]>

Опубликовано в htaccess, PHP, SEO Комментарии (107) »

]]>

Вы можете оставить комментарий. Трекбеки закрыты.

  • http://rmcreative.ru/ Sam

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

  • http://rmcreative.ru/ Sam

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

  • http://dixon-13.ya.ru/ Dixon

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

  • http://dixon-13.ya.ru Dixon

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

  • http://www.chanishvili.org/ Roland Chanishvily

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

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

    • http://dixon-13.ya.ru/ Dixon

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

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

    • http://blog.scratch613.info/ Scratch

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

  • http://www.chanishvili.org Roland Chanishvily

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

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

    • http://dixon-13.ya.ru Dixon

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

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

    • http://blog.scratch613.info Scratch

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

  • http://www.simplecoding.org/ Владимир

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

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

    • http://dixon-13.ya.ru/ Dixon

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

      • http://cczy.blog.ru/ Влад Никольский

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

        • http://www.simplecoding.org/ Владимир

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

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

        • http://cczy.blog.ru/ Capt Nikolskiy

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

        • http://www.simplecoding.org Владимир

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

        • http://cczy.blog.ru/ Capt Nikolskiy

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

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

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

          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://www.simplecoding.org Владимир

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

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

        • http://cczy.blog.ru/ Capt Nikolskiy

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

          большое спасибо, что нашли время ответить на мои делетантские вопросы. Чтобы сократить время, гляньте пожалуйста – 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" :

        • http://www.simplecoding.org Владимир

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

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

  • http://www.simplecoding.org/ Владимир

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

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

    • http://dixon-13.ya.ru Dixon

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

      • http://cczy.blog.ru Влад Никольский

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

        • http://www.simplecoding.org/ Владимир

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

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

  • http://blog.sribna.com/ Yuriy Drozdov

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

    • http://www.simplecoding.org/ Владимир

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

  • http://blog.sribna.com Yuriy Drozdov

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

    • http://www.simplecoding.org/ Владимир

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

  • Kate

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

  • Kate

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

  • http://www.doctorforex.net/ Виталий

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

    • http://www.simplecoding.org/ Владимир

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

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

  • http://www.doctorforex.net Виталий

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

    • http://www.simplecoding.org/ Владимир

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

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

  • http://dimoning.ru/ DimoninG

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

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

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

    • http://www.simplecoding.org/ Владимир

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

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

    • http://www.simplecoding.org/ Владимир

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

  • http://dimoning.ru DimoninG

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

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

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

    • http://www.simplecoding.org/ Владимир

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

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

    • http://www.simplecoding.org/ Владимир

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

  • sonik

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

    http://hider.org.ua/

    • http://www.simplecoding.org/ Владимир

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

  • sonik

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

    http://hider.org.ua/

    • http://www.simplecoding.org/ Владимир

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

  • sonik

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

    • http://www.simplecoding.org/ Владимир

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

  • sonik

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

    • http://www.simplecoding.org/ Владимир

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

  • Nothing

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

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

    • http://www.simplecoding.org/ Владимир

      Можно сделать так.
      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 параметра и формируем на его основе ссылку.

      • http://samaraoffline.ru/ Electronicman

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

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

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

        Заранее спасибо :)

        • http://www.simplecoding.org/ Владимир

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

        • http://www.simplecoding.org/ Владимир

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

  • Nothing

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

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

    • http://www.simplecoding.org/ Владимир

      Можно сделать так.
      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 параметра и формируем на его основе ссылку.

      • http://samaraoffline.ru Electronicman

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

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

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

        Заранее спасибо :)

        • http://www.simplecoding.org/ Владимир

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

        • http://www.simplecoding.org/ Владимир

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

  • http://film-poisk.ru/ скачать фильмы

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

    • http://www.simplecoding.org/ Владимир

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

  • http://film-poisk.ru скачать фильмы

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

    • http://www.simplecoding.org/ Владимир

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

  • http://samiro.ru/ Алексей

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

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

    • http://www.simplecoding.org/ Владимир

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

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

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

      • http://samiro.ru/ Алексей

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

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

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

        • http://samiro.ru/ Алексей

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

        • http://samiro.ru/ Алексей

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

        • http://www.simplecoding.org/ Владимир

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

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

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

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

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

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

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

  • http://samiro.ru/ Алексей

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

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

    • http://www.simplecoding.org/ Владимир

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

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

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

      • http://samiro.ru/ Алексей

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

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

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

        • http://samiro.ru/ Алексей

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

        • http://samiro.ru/ Алексей

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

        • http://www.simplecoding.org/ Владимир

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

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

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

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

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

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

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

  • http://samiro.ru/ Алексей

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

    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]

    • http://www.simplecoding.org/ Владимир

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

    • http://www.simplecoding.org/ Владимир

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

  • http://samiro.ru/ Алексей

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

    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]

    • http://www.simplecoding.org/ Владимир

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

    • http://www.simplecoding.org/ Владимир

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

  • http://buro.nahodok.ru/ Елена

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

  • http://buro.nahodok.ru Елена

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

  • http://itnewsonly.com/ a.lesyk

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

    • http://www.simplecoding.org/ Владимир

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

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

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

    • Djhbasc

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

  • http://itnewsonly.com a.lesyk

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

    • http://www.simplecoding.org/ Владимир

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

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

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

  • businessuspeh

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

  • http://www.simplecoding.org Владимир

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

  • Alex

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

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

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

    ?

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

  • http://www.simplecoding.org Владимир

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

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

  • Alex

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

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

  • http://www.simplecoding.org Владимир

    Просто попробуйте :)

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

  • Fimka Home

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

    • http://www.simplecoding.org Владимир

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

  • Shkur

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

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

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

    • http://www.simplecoding.org Владимир

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

      • http://www.karta-fitness.ru Shkur

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

        • http://www.simplecoding.org Владимир

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

  • http://www.allsport-video.ru Mav1creator

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

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

    • http://www.simplecoding.org Владимир

      Существует однозначное соответствие между внешней ссылкой и внутренней или нет?
      Если нет, то я не представляю что можно сделать.
      Если да, то в 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…

    • http://www.simplecoding.org Владимир

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

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

      Не проверял.

  • Zhanna

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

  • http://www.simplecoding.org Владимир

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

  • black spa

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

]]>
Tweet