Редирект на PHP (Переадресация внешних ссылок)

Форум для тех кто начинает осваивать язык php.
Аватара пользователя
Владимир
Сообщения: 37

Редирект на PHP (Переадресация внешних ссылок)

Сообщение Владимир » Вс окт 05, 2014 3:47 pm

Привет!
Стоит задача сделать редирект внешних ссылок на php.
Если в комментарий была вставлена ссылка на сторонний сайт, то пользователя перенаправляет на файл, например redirect.php, там он увидит сообщение, что он перейдет на сторонний ресурс, через три секунды.
Как такое завернуть?
Спасибо.
Реклама
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Редирект на PHP (Переадресация внешних ссылок)

Сообщение Slash » Вт окт 07, 2014 8:08 pm

Если честно, в голове ни каких идей... Набросал немного кода, есть недоработки. В общем вот пример:
Файл index.php:

Код: Выделить всё

<?php
$my_domain = 'http://' . $_SERVER['HTTP_HOST']; #Создаем переменную с адресом своего сайта

$url = array #Создаем массив с ссылками, среди которых есть ссылка на свой сайт
(
    'http://google.ru',
    'http://yandex.ru',
    'http://mail.ru',
    'http://rambler.ru',
    $my_domain,
);

foreach ($url as $value) #Выводим список ссылок
{
    if ($value == $my_domain) #Проверяем совпадает ли URL с нашим доменом, если да, то делаем прямую ссылку
    {
        echo '<a href="' . $value . '">' . $value . '</a><br />';
    }
    else #Если URL не совпадает делаем ссылку через редирект
    {
        echo '<a href="redirect.php?url=' . $value . '" onclick="window.open(this.href); return false;">' . $value . '</a><br />';
    }
}
?>

Файл redirect.php:

Код: Выделить всё

<?php
    $url = isset($_GET['url']) ? $_GET['url'] : null;
    if (!$url)
    {
        echo 'Ошибка URL.';
    }
    else
    {
        echo 'Через 3 секунды Вы будите перейдёте на сайт: <strong>' . $url . '</strong>.<br />Если Ваш браузер не поддерживает авто перенаправление, можете нажать <a href="' . $url . '">сюда</a>.';
        header('Refresh: 3; url=' . $url);
    }
?>

Что я тут не доработал?
Работа с ссылками только с главной страницей, без index..., если адрес будет какой то конкретной страницы, скрипт будет работать не правильно.
Возможно потом доделаю эту недоработку.
lyod
Сообщения: 76

Re: Редирект на PHP (Переадресация внешних ссылок)

Сообщение lyod » Вт окт 07, 2014 9:31 pm

Ну вот так как-то можно сделать поиск и замену ссылки в тексте:

Код: Выделить всё

<?php
    # Это комментарий, который якобы пришёл из формы
    $comment = 'Это мой комментарий и ссылка на левый сайт: http://ya.ru/, её мы и обработаем';
    
    # Адрес скрипта, через который будут проходить ссылки
    $redirector = 'redirect.php';
    
    # Шаблоны поиска и замены ссылки
    $pattern = array(
        'search'  => '~(https?://[^\s\b]+)~i',
        'replace' => '<a href="'.$redirector . '?link=$1'.'">$1</a>'
    );
    
    # Ищем ссылку в комметариев
    $comment = preg_replace($pattern['search'], $pattern['replace'], $comment);

И вот код файла redirect.php:

Код: Выделить всё

<?php
    # Получаем ссылку, на которую перенаправляем
    $link = isset( $_GET['link'] ) ? $_GET['link'] : null;
    
    # Перенаправляем
    header('Refresh:113;url='.$link);
?>
Через несколько секунд Вы будете перенаправлены на <a href="<?=$link?>"><?=$link?></a>

Грубовато конечно, над скриптом в некоторых местах неплохо бы поработать. Но суть я объяснил :)
Аватара пользователя
Владимир
Сообщения: 37

Re: Редирект на PHP (Переадресация внешних ссылок)

Сообщение Владимир » Ср окт 08, 2014 10:07 am

Спасибо.
lyod, а как в Вашем коде вычисляется ссылка сторонняя или нет?
lyod
Сообщения: 76

Re: Редирект на PHP (Переадресация внешних ссылок)

Сообщение lyod » Ср окт 08, 2014 7:07 pm

Владимир, никак :). Вот я офоршмачился :D. Этого я не предусмотрел...
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Редирект на PHP (Переадресация внешних ссылок)

Сообщение Slash » Пт окт 10, 2014 2:41 pm

Для моего варианта редиректа: Re: Редирект на PHP (Переадресация внешних ссылок) предлагаю сделать еще кодирование адреса стороннего сайта при помощи функции base64_encode(), придать ссылке примерно такой вид:

Код: Выделить всё

http://сайт.ру/redirect.php?url=aHR0cDovL3JhbWJsZXIucnU=

Делаем так:
В файле index.php, находим 21 строку:

Код: Выделить всё

        echo '<a href="redirect.php?url=' . $value . '" onclick="window.open(this.href); return false;">' . $value . '</a><br />';

и меняем её на:

Код: Выделить всё

       $link = base64_encode($value);
        echo '<a href="redirect.php?url=' . $link . '" onclick="window.open(this.href); return false;">' . $value . '</a><br />';

Далее, при помощи функции base64_decode() раскодируем адрес. В файле redirect.php, находим 9 строку:

Код: Выделить всё

        echo 'Через 3 секунды Вы будите перейдёте на сайт: <strong>' . $url . '</strong>.<br />Если Ваш браузер не поддерживает авто перенаправление, можете нажать <a href="' . $url . '">сюда</a>.';

и меняем её на:

Код: Выделить всё

       $url = base64_decode($url);
        echo 'Через 3 секунды Вы будите перейдёте на сайт: <strong>' . $url . '</strong>.<br />Если Ваш браузер не поддерживает авто перенаправление, можете нажать <a href="' . $url . '">сюда</a>.';

Готово!
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Редирект на PHP (Переадресация внешних ссылок)

Сообщение Slash » Пн окт 20, 2014 10:38 am

Продолжаю писать редирект внешних ссылок и на этот раз (как и говорил) написал редирект с полными ссылками, то есть теперь проходит проверка не тока адреса главной страницы (пример http://google.com/), но и с любой другой конкретной страницей (пример https://www.google.com/doodles/claude-d ... t-birthday). Ещё, я подумал, что будет лучше если прикрутить эту разработку: Обрезка длинных адресов (URL) в наш редирект.
Значит, берем вариант моего редиректа: Re: Редирект на PHP (Переадресация внешних ссылок), с этими правками: Re: Редирект на PHP (Переадресация внешних ссылок) и вносим следующие изменения:
В файле index.php находим вторую строку:

Код: Выделить всё

$my_domain = 'http://' . $_SERVER['HTTP_HOST']; #Создаем переменную с адресом своего сайта

меняем на:

Код: Выделить всё

$my_domain = $_SERVER['HTTP_HOST']; #Создаем переменную с адресом своего сайта

В массиве ссылок меняем переменную $my_domain на адрес своего сайта, например у меня так http://danfa.org:

Код: Выделить всё

$url = array #Создаем массив с ссылками, среди которых есть ссылка на свой сайт
(
    'http://google.ru',
    'http://yandex.ru',
    'http://mail.ru',
    'http://rambler.ru',
    'http://danfa.org',
);

Находим:

Код: Выделить всё

foreach ($url as $value) #Выводим список ссылок
{

добавляем после:

Код: Выделить всё

    $domain = explode('/', $value);
   $anchor_link = (strlen($value) > 50) ? substr($value, 0, 25) . ' ... ' . substr($value, -15) : $value;

Находим:

Код: Выделить всё

    if ($value == $my_domain) #Проверяем совпадает ли URL с нашим доменом, если да, то делаем прямую ссылку

меняем на:

Код: Выделить всё

    if ($domain[2] == $my_domain) #Проверяем совпадает ли URL с нашим доменом, если да, то делаем прямую ссылку

Находим:

Код: Выделить всё

        echo '<a href="' . $value . '">' . $value . '</a><br />';

меняем на:

Код: Выделить всё

        echo '<a href="' . $value . '">' . $anchor_link . '</a><br />';

Находим:

Код: Выделить всё

        echo '<a href="redirect.php?url=' . $link . '" onclick="window.open(this.href); return false;">' . $value . '</a><br />';

меняем на:

Код: Выделить всё

        echo '<a href="redirect.php?url=' . $link . '" onclick="window.open(this.href); return false;">' . $anchor_link . '</a><br />';

Далее редактируем файл redirect.php:
Находим:

Код: Выделить всё

       $url = base64_decode($url);
        echo 'Через 3 секунды Вы будите перейдёте на сайт: <strong>' . $url . '</strong>.<br />Если Ваш браузер не поддерживает авто перенаправление, можете нажать <a href="' . $url . '">сюда</a>.';

меняем на:

Код: Выделить всё

       $url = base64_decode($url);
      $anchor_link = (strlen($url) > 50) ? substr($url, 0, 25) . ' *** ' . substr($url, -15) : $url;
        echo 'Через 3 секунды Вы будите перейдёте на сайт: <strong>' . $anchor_link . '</strong>.<br />Если Ваш браузер не поддерживает авто перенаправление, можете нажать <a href="' . $url . '">сюда</a>.';

Сохраняем. Готово!
Результат со всеми правками должен быть такой:
Файл index.php:

Код: Выделить всё

<?php
$my_domain = $_SERVER['HTTP_HOST']; #Создаем переменную с адресом своего сайта

$url = array #Создаем массив с ссылками, среди которых есть ссылка на свой сайт
(
    'http://google.ru',
    'http://yandex.ru',
    'http://mail.ru',
    'http://rambler.ru',
    'http://danfa.org',
);

foreach ($url as $value) #Выводим список ссылок
{
    $domain = explode('/', $value);
   $anchor_link = (strlen($value) > 50) ? substr($value, 0, 25) . ' ... ' . substr($value, -15) : $value;
   
    if ($domain[2] == $my_domain) #Проверяем совпадает ли URL с нашим доменом, если да, то делаем прямую ссылку
    {
        echo '<a href="' . $value . '">' . $anchor_link . '</a><br />';
    }
    else #Если URL не совпадает делаем ссылку через редирект
    {
       $link = base64_encode($value);
        echo '<a href="redirect.php?url=' . $link . '" onclick="window.open(this.href); return false;">' . $anchor_link . '</a><br />';
    }
}
?>

Файл redirect.php:

Код: Выделить всё

<?php
    $url = isset($_GET['url']) ? $_GET['url'] : null;
   if (!$url)
   {
       echo 'Ошибка URL.';
   }
   else
   {
       $url = base64_decode($url);
      $anchor_link = (strlen($url) > 50) ? substr($url, 0, 25) . ' ... ' . substr($url, -15) : $url;
        echo 'Через 3 секунды Вы будите перейдёте на сайт: <strong>' . $anchor_link . '</strong>.<br />Если Ваш браузер не поддерживает авто перенаправление, можете нажать <a href="' . $url . '">сюда</a>.';
      header('Refresh: 3; url=' . $url);
   }
?>
Аватара пользователя
Местный бот
Сообщения: 153

Re: Редирект на PHP (Переадресация внешних ссылок)

Сообщение Местный бот » Ср дек 10, 2014 3:58 pm

А как сделать редерект, как ВК.
Что бы даже в постах был сам адрес закодирован, например так http://danfa.org/fryhs?
Спасибо.
<php
// Понравилось? Жми большой палец вверх.
// Местный бот 2014 - 2016 ©

echo 'Большой Привет от Местного бота!';
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Редирект на PHP (Переадресация внешних ссылок)

Сообщение Slash » Сб мар 21, 2015 8:21 am

Местный бот писал(а):например так http://danfa.org/fryhs

Как вариант: в index.php, найти:

Код: Выделить всё

foreach ($url as $value) #Выводим список ссылок
{
    $domain = explode('/', $value);
   $anchor_link = (strlen($value) > 50) ? substr($value, 0, 25) . ' ... ' . substr($value, -15) : $value;
   
    if ($domain[2] == $my_domain) #Проверяем совпадает ли URL с нашим доменом, если да, то делаем прямую ссылку
    {
        echo '<a href="' . $value . '">' . $anchor_link . '</a><br />';
    }
    else #Если URL не совпадает делаем ссылку через редирект
    {
       $link = base64_encode($value);
        echo '<a href="redirect.php?url=' . $link . '" onclick="window.open(this.href); return false;">' . $anchor_link . '</a><br />';
    }
}

заменить на:

Код: Выделить всё

foreach ($url as $value) #Выводим список ссылок
{
    $domain = explode('/', $value);
   
    if ($domain[2] == $my_domain) #Проверяем совпадает ли URL с нашим доменом, если да, то делаем прямую ссылку
    {
       $anchor_link = (strlen($value) > 50) ? substr($value, 0, 25) . ' ... ' . substr($value, -15) : $value;   
        echo '<a href="' . $value . '">' . $anchor_link . '</a><br />';
    }
    else #Если URL не совпадает делаем ссылку через редирект
    {
       $link = base64_encode($value);
      $anchor_link = 'http://danfa.org/' . substr($link, 12, 5);
        echo '<a href="redirect.php?url=' . $link . '" onclick="window.open(this.href); return false;">' . $anchor_link . '</a><br />';
    }
}

Заменить danfa.org на свой адрес.
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Редирект на PHP (Переадресация внешних ссылок)

Сообщение Slash » Сб авг 29, 2015 9:34 pm

Нашел маленький недочет! Если переменная $domain[2] содержит адрес своего же сайта с www, а ссылка в тексте написана без www или наоборот, то сценарий посчитает url, как ссылку на сторонний сайт и пропустит её через редерект.
Эту проблему я решил так: в index.php, найти:

Код: Выделить всё

    if ($domain[2] == $my_domain) #Проверяем совпадает ли URL с нашим доменом, если да, то делаем прямую ссылку

и заменить на:

Код: Выделить всё

    $domain = (strstr($domain[2], 'www.')) ? (str_replace('www.', '', $domain[2])) : $domain[2];
    if ($domain == $my_domain) #Проверяем совпадает ли URL с нашим доменом, если да, то делаем прямую ссылку
Аватара пользователя
Slash
Администратор
Сообщения: 2029
Поблагодарили: 62 раза

Re: Редирект на PHP (Переадресация внешних ссылок)

Сообщение Slash » Ср сен 02, 2015 9:11 am

Благодаря теме Действие через x секунд на JavaScript
Код должен быть примерно таким (согласно всем правкам выше):
Файл index.php:

Код: Выделить всё

<?php
$my_domain = $_SERVER['HTTP_HOST']; #Создаем переменную с адресом своего сайта

$url = array #Создаем массив с ссылками, среди которых есть ссылка на свой сайт
(
    'http://google.ru',
    'http://yandex.ru',
    'http://mail.ru',
    'http://rambler.ru',   
    'http://danfa.org'
);

foreach ($url as $value) #Выводим список ссылок
{
    $domain = explode('/', $value);
   $anchor_link = (strlen($value) > 50) ? substr($value, 0, 25) . ' ... ' . substr($value, -15) : $value;
   
    $domain = (strstr($domain[2], 'www.')) ? (str_replace('www.', '', $domain[2])) : $domain[2];
    if ($domain == $my_domain) #Проверяем совпадает ли URL с нашим доменом, если да, то делаем прямую ссылку
    {
        echo '<a href="' . $value . '">' . $anchor_link . '</a><br />';
    }
    else #Если URL не совпадает делаем ссылку через редирект
    {
       $link = base64_encode($value);
        echo '<a href="redirect.php?url=' . $link . '" onclick="window.open(this.href); return false;">' . $anchor_link . '</a><br />';
    }
}
?>

Файл redirect.php:

Код: Выделить всё

<?php
    $url = isset($_GET['url']) ? $_GET['url'] : null;
   if (!$url)
   {
       echo 'Ошибка URL.';
   }
   else
   {
       $url = base64_decode($url);
      $anchor_link = (strlen($url) > 50) ? substr($url, 0, 25) . ' ... ' . substr($url, -15) : $url;
      echo '<script type="text/javascript">
    function timer()
    {
        var redirect = document.getElementById("timer_redirect");
        redirect.innerHTML--;
 
        if (redirect.innerHTML == 0)
       {
           window.location.href = "' . $url . '";
       }
        else
       {
           setTimeout(timer, 1000);
       }
    }
   
    setTimeout(timer, 1000);
</script>';
        echo 'Через <span id="timer_redirect">15</span> секунды Вы будите перейдёте на сайт: <strong>' . $anchor_link . '</strong>.<br />Если Ваш браузер не поддерживает авто перенаправление, можете нажать <a href="' . $url . '">сюда</a>.';
   }
?>

Вернуться в «PHP»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость