PHP редирект внешних ссылок. Редирект с задержкой и таймером обратного отсчета. Скрытие реферальных ссылок

Logo
PHP редирект внешних ссылок. Редирект с задержкой и таймером обратного отсчета. Скрытие реферальных ссылок

В этой статье речь пойдет о создании скрипта php редиректа внешних ссылок. Будут рассмотрены примеры создания обычного php редиректа и редиректа с задержкой. При этом также будет рассмотрен процесс создания таймера обратного отсчета на JavaScript + JQuery и способ скрытия реферальных ссылок. После рассмотрения всех примеров будут предоставлены ссылки на скачку файлов скриптов, а также подробное руководство по установке и использованию скрипта редиректа. Ну и в заключении вы найдете код для добавления кнопок редиректа в редактор WordPress.

Идея создания данного скрипта возникла у меня после того, как я отключил плагин WpNoRef, который отвечал за индексацию внешних ссылок. О нем я уже упоминал в статье «Создание полнофункционального сайта (блога) на WordPress». Суть работы плагина заключалась в помещении всех внешних ссылок в теги <noindex> и добавлении к ним атрибута rel=»nofollow».

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

Создавался специальный файл, например, redirect.php, который содержал следующий код.

<?php
$URL="http://google.com";
header("Location:$URL");
exit();
?>

Затем вместо внешней ссылки указывалась ссылка на нужный файл с редиректом, который перенаправляет пользователей на нужную нам страницу. В данном случае это файл redirect.php, который перенаправляет пользователей на страницу http://google.com.

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

Суть его работы состоит в том, чтобы передавать в исполняющий файл необходимые параметры при помощи php метода GET. Далее скрипт обрабатывает полученные данные и перенаправляет пользователей на нужную страницу. Код в данном случае имеет следующий вид.

if (isset($_GET['url'])) {$url = $_GET['url']; }
if (!isset($url))
{
$url = 'http://dmitriydenisov.com';
}
if (!preg_match('#(http?|ftp)://\S+[^\s.,>)\];\'\"!?]#i',$url)) {
exit ("<p>Неверный формат запроса! Проверьте URL!");
}
header("Location:$url");
exit();

Теперь давайте коротко разберем вышеприведенный код редиректа.

Первым делом мы проверяем, существует ли переменная переданная методом GET. Если да, то преобразовываем ее в обычную переменную. Если же нет, то присваиваем переменной $url исходное значение.

Далее мы проверяем переменную $url. Если переменная прошла проверку, то перенаправляем пользователя на нужную страницу. Если же нет, то завершаем работу скрипта и выводим сообщение об ошибке.

Теперь давайте немного расширим возможности нашего скрипта php редиректа и добавим возможность скрытия реферальных ссылок и вывода всего списка ссылок на экран по запросу.

Скрипт php редиректа с возможностью скрытия реферальных ссылок

Скрытие реферальных ссылок мы произведем следующим образом.

Для начала создадим ассоциативный массив, который будет хранить в себе наши реферальные ссылки.

$partner = array (
'1' => 'http://key.net',
'http://google.com' => 'http://test.com',
'http://dmitriydenisov.com' => 'http://blog.com'
);

Как видно с примера выше, в качестве индекса мы указываем нашу реферальную ссылку, а в качестве значения ключ по которому будет вызываться эта ссылка. Кроме этого в самом начале создадим элемент, который будет использован в качестве ключа для просмотра через браузер всех элементов массива. Об этом мы поговорим чуть позже.

Итак, ассоциативный массив у нас создан. Теперь используем функцию php array_search() для поиска индекса элемента массива $partner по его значению, которое мы получим из адресной строки методом GET.

$key = array_search("$url", $partner);

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

if ($key == true) {
header("Location:$key");
}
Else
{
header("Location:$url");
exit();
}

Теперь добавим возможность просмотра всего списка партнерских ссылок по ключу. В качестве ключа вы можете использовать любой URL. В нашем случае это http://key.net, который находится в ассоциативном массиве под индексом «1».

Итак, для реализации возможности просмотра ссылок организуем цикл по значениям в массиве $partner при помощи конструкции php foreach.

if ($key == '1') {
foreach($partner as $key=>$value)
echo "$key - $value"."<br />";
exit();
}

После завершения выполнения вывода значений массива не забываем завершить работу скрипта. Теперь при переходе по ссылке с ключом вместо редиректа нам выведется страница со значениями всех партнерских ссылок и их ключами.

Ну а теперь давайте соберем все эти куски кода вместе и рассмотрим код всего скрипта php редиректа целиком.

<?php
if (isset($_GET['url'])) {$url = $_GET['url']; }
if (!isset($url))
{
$url = 'http://dmitriydenisov.com';
}
if (!preg_match('#(http?|ftp)://\S+[^\s.,>)\];\'\"!?]#i',$url)) {
exit ("<p>Неверный формат запроса! Проверьте URL!");
}
$partner = array (
'1' => 'http://key.net',
'http://google.com' => 'http://test.com',
'http://ref-link.com' => 'http://site.com'
);
$key = array_search("$url", $partner);
if ($key == true) {
if ($key == '1') {
foreach($partner as $key=>$value)
echo "$key - $value"."<br />";
exit();
}
else
{
header("Location:$key");
}
}
else {
header("Location:$url");
exit();
}
?>

Итак, процесс создания скрипта php редиректа мы рассмотрели. Теперь сохраняем полученный код в файле, например, go.php и копируем его на хостинг к другим файлам сайта. Если вы скопируете данный файл в корень сайта, то для создания редиректа вам нужно будет использовать такую конструкцию.

http://mysite.com/go.php?url=http://site.com

где http://site.com – ссылка на страницу, на которую будет произведен редирект.

Также не забываем закрыть от индексации поисковыми системами файл редиректа go.php. Для этого добавляем в файл robots.txt, который находится в корне сайта, следующую строчку.

Disallow: /go.php

Либо же вы можете создать отдельную директорию для скриптов и поместить файл go.php туда, после чего закрыть директорию в robots.txt.

Disallow: /extension

Где extension – папка со скриптами, которая расположена в корне сайта.

Теперь давайте перейдем к рассмотрению способа создания скрипта php редиректа с задержкой и таймером обратного отсчета на JavaScript + JQuery.

Скрипт php редиректа с задержкой и таймером обратного отсчета

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

header("Location:$url");

на

header("Refresh: 12; URL = $url");

где Refresh: 12 отвечает за задержку на 12 секунд.

Кроме этого мы добавим таймер обратного отсчета на нашу страницу редиректа. Код таймера обратного отсчета будет иметь следующий вид.

<script type="text/javascript">
var timetogo = 10;
var timer = window.setInterval(function()
{
var str = timetogo;
$('#counter').text(str);

if (timetogo <= 0)
{
$('#redirect').text('Переадресация...');
window.clearInterval(timer);
}
timetogo--;
}, 1000);
</script>
<div style="float: left; display: inline; text-align: center; width: 100%;" id="redirect">Переход по внешней ссылке будет произведен через: <div id="counter">10</div></div>

Где timetogo = 10 – начальное время отсчета.

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

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

<?php
if (isset($_GET['url'])) {$url = $_GET['url']; }
if (!isset($url))
{
$url = 'http://dmitriydenisov.com';
}
if (!preg_match('#(http?|ftp)://\S+[^\s.,>)\];\'\"!?]#i',$url)) {
exit ("<p>Неверный формат запроса! Проверьте URL!");
}

$partner = array (
'1' => 'http://key.net',
'http://google.com' => 'http://test.com',
'http://ref-link.com' => 'http://site.com'
);
$key = array_search("$url", $partner);
if ($key == true) {
if ($key == '1') {
foreach($partner as $key=>$value)
echo "$key - $value"."<br />";
exit();
}
else
{
header("Refresh: 12; URL = $key");
}
}
else {
header("Refresh: 12; URL = $url");
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Переход по внешней ссылке</title>
<script type="text/javascript" src="jquery-1.5.1.min.js"></script>
</head>
<body>
<script type="text/javascript">
var timetogo = 10;
var timer = window.setInterval(function()
{
var str = timetogo;
$('#counter').text(str);

if (timetogo <= 0)
{
$('#redirect').text('Переадресация...');
window.clearInterval(timer);
}
timetogo--;
}, 1000);
</script>
<div style="float: left; display: inline; text-align: center; width: 100%;" id="redirect">Переход по внешней ссылке будет произведен через: <div id="counter">10</div></div>
</body>
</html>
<?php
exit();
?>

Как видно с кода выше, для работы таймера обратного отсчета нам потребуется подключить к странице библиотеку JQuery. Для этого нам потребуется скачать соответствующий файл с сайта JQuery или же воспользоваться тем, что будет в архиве с исходниками, ссылку на скачку которых вы сможете найти в конце статьи.

Итак, процесс создания простого php редиректа и редиректа с задержкой и таймером обратного отсчета мы рассмотрели. Теперь давайте перейдем к заключительной части и рассмотрим код для добавления кнопок редиректа в редактор Wordrpess.

Добавление кнопок редиректа в редактор Wordrpess

Поскольку в предыдущей статье «Shortcode WordPress. Как добавить новые кнопки в редактор WordPress» мы уже рассматривали процесс добавления новых кнопок в редактор, то сейчас я приведу лишь сам код кнопок без инструкции по установке. Саму инструкцию вы сможете найти в соответствующей статье, ссылка на которую находится чуть выше.

Код для добавления кнопки редиректа в редактор WordPress выглядит следующим образом

edButtons[edButtons.length] =
new edButton('ed_go'
,'Go.php'
,'http://dmitriydenisov.com/links/go.php?url='
,''
,''
,-1
);
t.Buttons[t.Buttons.length] = new edButton(name+'_go','Go.php','http://dmitriydenisov.com/links/go.php?url=','','',-1);

Как вы уже поняли, перед добавлением кода на свой сайт вам нужно будет изменить ссылку на файл go.php на свою. После этого добавляем код в файл quicktags.js и сохраняем результат, после чего можно приступить к использованию новой кнопки.

Использование кнопки очень простое. Для этого перейдите в редакторе в режим HTML, найдите внешнюю ссылку, после чего выделите ее и нажмите на кнопку в редакторе. В результате этого внешняя ссылка примет следующий вид.

http://dmitriydenisov.com/links/go.php?url=http://site.com

где http://dmitriydenisov.com/links/go.php — путь к файлу go.php.

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

И чуть не забыл. Скачать файлы скрипта php редиректа вы можете по следующей ссылке — скачать исходники скрипта.

На этом все. Удачи вам и успехов в построении сайтов.

Обнаружили ошибку? Выделите ее и нажмите Ctrl+Enter

Комментарии 20

  • Наталья

    Добрый день, подскажите пожалуйста можно ли с помощью редиректа решить следующую проблему: есть сайт, движок nimble, картинки все размещены в папке images, но они не отображаются на сайте. По какой-то причине адрес откуда берутся картинки стоит такой 
    /usr/home/логин учетной записи/data/www/адрес сайта/images/. 
    Если с помощью редиректа можно решить, подскажите пожалуйста или приведите пример.

  • Дмитрий

    Здравствуйте, Наталья!
    Скорее всего была допущена ошибка при работе с сайтом. Чаще всего это случается при переносе сайта на хостинг. В данном случае редирект вам не поможет.
    Для решения данной проблемы попробуйте заменить относительные пути на реальные. То есть вместо «/usr/home/логин учетной записи/data/www/адрес сайта/images/» должно быть «адрес сайта/images/». Данные пути в 99% случаев нужно заменять в базе данных. Для этого скачайте БД через phpMyAdmin, замените пути и закачайте базу обратно. Не забудьте предварительно сделать резервную копию сайта.

  • Наталья

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

    RewriteEngine On
    RewriteBase /
    RewriteRule ^data/.* — [F]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    Этот файл был в сборке движка изначально. 

  • Дмитрий

    Боюсь, что без осмотра сайта вряд ли удастся вам помочь…

  • Александр

    Спасибо за рабочий скрипт!
    Есть вопрос на сколько он безопасен для простого по сути штмл сайта?
    И я немного по другому сделал, я создал папку go а там index.php и урл теперь
    <a href="http://test.org/go/?url=http://test2.org&quot; target='_blank'>redirect</a> вроде работает!
    Ах да в версии с задержкой секунды назад не отсчитывает, просто 10 висит и всё а потом редиректит.

  • Дмитрий

    Скрипт безопасен. Давно использую его и никаких нареканий не было. Что касается таймера, то стоит еще раз пересмотреть код. Возможно, допустили какую-то ошибку. У меня данный скрипт работает. Для проверки можете использовать этот url — dmitriydenisov.com/links/go.php?url=http://google.com

  • Александр

    "Скрипт безопасен" — ну это самое главное.
    "У меня данный скрипт работает" — ну Вы же понимаете  что я тупо скопировал код с Вашего сайта и всё, секунды назад не отсчитывало, имеется ввиду в режиме реального времени, да когда осталось 10, 9, 8, …… а сам он рабочий это так.
    В любом случае спасибо поставил Вашу версию, и как то доверия больше, и работает, в отличие от остальных версий в инете.

  • Дмитрий

    Если Вы изменяли значения таймера, то нужно изменять код в 2-х местах. В противном случае, если выставить, например, 20 секунд, то отсчет начнется только на 10-й секунде. Поэкспериментируйте. Если не получится, то я всегда рад помочь.

  • Руслан

    спасибо за скрипт…
    Я немного не разобрался с массивом…
    Мне нужно чтобы скрипт осуществлялся на одном сайте, а реферал передавался другого сайта… т.е. подмена реферала…
    Как это осуществить в данном скрипте?

  • Дмитрий

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

  • Владик

    Я приспособил ваш вариант не для скрытия реф ссылок а просто пустил внешние ссылки через go.php + разместил в go рекламные блоки для пробы. И вот хотел узнать можно как-то изменить код чтобы внешняя ссылка открывалась в другом окне и не блокировалась браузером а go.php оставалась открытой ?

  • Дмитрий

    Попробуйте сделать открытие двух окон при нажатии на ссылку посредством JavaScritpt, например, вот так: <a href="#" onclick="window.open(‘http://www.yandex.ru’); window.open(‘http://www.google.ru’);">Анкор ссылки</a>

  • Александр

    Не понял про реф ссылки
    как их прятать, да и вообще как поисковики отнесутся к этому.
    допустим если будет не одна реф ссылка а много и на разные страницы сайта, как работать с Вашим скриптом?

  • Дмитрий

    В статье все подробно написано. Нужно заносить реф ссылку в массив. В данном случае это массив $partner. Что касается поисковых систем, то пользуюсь данным скриптом уже почти год и не было никаких нареканий. Все работает отлично.

  • Александр

    Это каждый раз заносить ссылку туда надо получается?
    Не совсем подробно, без знаний пхп трудно допереть что тут происходит
    $partner = array (
    '1' => 'http://key.net&apos;,
    'http://google.com&apos; => 'http://test.com&apos;,
    'http://ref-link.com&apos; => 'http://site.com&apos;
    );

  • Дмитрий

    Да, при добавлении нового сайта нужно вносить изменения в массив. Для тех, кто плохо знаком с PHP или не знаком вовсе, я привел подробные примеры. Остается только сделать все по аналогии и наслаждаться работой скрипта.

  • Дмитрий

    Здравствуйте.

    Ваш скрипт не работал пока я в строке 16 не снял кавычки с переменной $url. Так:
    $key = array_search($url, $partner);

    Разве при поиске по массиву через переменную — ее следует заключать в кавычки?

  • Дмитрий

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

  • Николай

    файлы скрипта php редиректа удалены с letitbit

    Запрашиваемый файл не найден

  • Дмитрий

    Создайте файлы самостоятельно или же напишите в "Контакты" и я вышлю все необходимые файлы.

Оставить комментарий

отменить ответ