Скрипт внутреннего редирект. Как ?

12
[Удален]
4027

Добрый день, господа.

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

<a href="http://мой-сайт.ru/go/?http://рекламный-сайт.ру" target="_blank">Я ссылка</a>

F
На сайте с 16.01.2010
Offline
267
#1

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

[Удален]
#2

ссылки будут только для 2-3 сайтов максимум, их можно занести в список доверенных. Можно так сделать ?

[Удален]
#3
C
На сайте с 28.01.2010
Offline
70
#4
Felixx:
Добрый день, господа.
Кто может подсказать как сделать скрипт внутреннего редиректа, чтобы внешние ссылки выглядели так.
<a href="http://мой-сайт.ru/go/?http://рекламный-сайт.ру" target="_blank">Я ссылка</a>


<?php
$trusted = array(
'http://yandex.ru',
'http://google.com',
'https://searchengines.guru/'
);
$link = $_GET['link'];
if (in_array($link, $trusted)) {
header("Location: $link");
} else {
header("Location: http://".$_SERVER['HTTP_HOST']);
}
?>

script.php?link=http://yandex.ru

Если хочется избавится от link=... можно в скрипте сделать

$link = current($_GET);

вместо

$link = $_GET['link'];

Это - личная подпись. Здесь обычно ставят ссылки на всякие кривые сайты, надеясь получить "жирный бек".
[Удален]
#5

Спасибо, это то что нужно, только проблема.

Можно сделать, чтобы доверенными были не конкретные адреса, а сайты на которые будут ссылки.

То есть у меня бывают не только адреса типа сайт.ру, чаще всего бывают ссылки типа сайт.ру/история_первая или сайт.ру/страница 1

То есть чтобы разрешение давалось на все страницы доверенного домена.

[Удален]
#6
Counselor:

<?php
$trusted = array(
'http://yandex.ru',
'http://google.com',
'https://searchengines.guru/'
);
$link = $_GET['link'];
if (in_array($link, $trusted)) {
header("Location: $link");
} else {
header("Location: http://".$_SERVER['HTTP_HOST']);
}
?>


script.php?link=http://yandex.ru

Если хочется избавится от link=... можно в скрипте сделать
$link = current($_GET);
вместо
$link = $_GET['link'];

а если в редиректе будет символ "&" ? ваш скрипт корректно его не обработает!!

П.С. я бы посоветовал ссылки кодировать base64_encode.


<a href='/redir.php?link=<?=base64_encode('/ru/forum/comment/8499609)?>'>ссылка</a>

redir.php


$link=base64_decode($_GET['link']);
$host=parse_url($link);
$host=@$host['host'];
$trusted = array(
'yandex.ru',
'google.com',
'forum.searchengines.ru'
);
if (in_array($host,$trusted))
{
header("Location: $link");
} else
{
header("Location: http://".$_SERVER['HTTP_HOST']);
}

П.П.С. только надо учитывать, что при кодировании base64_encode длина строки увеличивается где то на 10-20 %, и то что функция parse_url не самый защищенный вариант.

[Удален]
#7

Ошибка вылетает

$link=base64_decode($_GET['link']); $host=parse_url($link); $host=@$host['host']; $trusted = array( 'www.yandex.ru', 'google.com', 'forum.searchengines.ru' ); if (in_array($host,$trusted)) { header("Location: $link"); } else { header("Location: http://".$_SERVER['HTTP_HOST']); }
[Удален]
#8
Felixx:
Ошибка вылетает
$link=base64_decode($_GET['link']); $host=parse_url($link); $host=@$host['host']; $trusted = array( 'www.yandex.ru', 'google.com', 'forum.searchengines.ru' ); if (in_array($host,$trusted)) { header("Location: $link"); } else { header("Location: http://".$_SERVER['HTTP_HOST']); }

что за ошибка то хоть ?

[Удален]
#9

Всё понял где ошибка

Soulwest, Всё работает, большое спасибо!

Soulwest, ещё вопросик, а поисковики будут видеть такую ссылку ?

если файл redir.php закрыть в роботс.тхт

[Удален]
#10
Felixx:
Всё понял где ошибка

Soulwest, Всё работает, большое спасибо!
Soulwest, ещё вопросик, а поисковики будут видеть такую ссылку ?
если файл redir.php закрыть в роботс.тхт

нет, не будут

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий