Ссылки через редирект, часть 2

Автор Captain Fizz, 12 января 2009, 13:00:29

« назад - далее »

0 Пользователи и 2 гостей просматривают эту тему.

Captain Fizz

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

Движок 2.0.4. Открываем файл Sources/Subs.php и ищем код:
if (isset($tag['validate']))
$tag['validate']($tag, $data, $disabled);

$code = strtr($tag['content'], array('$1' => $data));
$message = substr($message, 0, $pos) . $code . substr($message, $pos2 + 3 + strlen($tag['tag']));


Заменяем его на этот код:
if (isset($tag['validate']))
$tag['validate']($tag, $data, $disabled);

////////////////////////////////////////////////////////////////////////////////
if(!strstr($data,$scripturl)) {
if($tag['tag']=='url')
$tag['content']='<a href="go.php?url=$1" class="bbc_link new_win" target="_blank" rel="nofollow">$1</a>';

if($tag['tag']=='iurl')
$tag['content']='<a href="go.php?url=$1" class="bbc_link" target="_blank" rel="nofollow">$1</a>';

if($tag['tag']=='ftp')
$tag['content']='<a href="go.php?url=$1" class="bbc_ftp new_win" target="_blank" rel="nofollow">$1</a>';
}
////////////////////////////////////////////////////////////////////////////////

$code = strtr($tag['content'], array('$1' => $data));
$message = substr($message, 0, $pos) . $code . substr($message, $pos2 + 3 + strlen($tag['tag']));




Ищем также:
$tag['after'] = strtr($tag['after'], array('$1' => $data));

$open_tags[] = $tag;

$code = strtr($tag['before'], array('$1' => $data));
$message = substr($message, 0, $pos) . $code . substr($message, $pos2 + ($quoted == false ? 1 : 7));
$pos += strlen($code) - 1;


Заменяем на:
$tag['after'] = strtr($tag['after'], array('$1' => $data));

$open_tags[] = $tag;

////////////////////////////////////////////////////////////////////////////////
if(!strstr($data,$scripturl)) {
if($tag['tag']=='url')
$tag['before']='<a href="go.php?url=$1" class="bbc_link new_win" target="_blank" rel="nofollow">';

if($tag['tag']=='iurl')
$tag['before']='<a href="go.php?url=$1" class="bbc_link" target="_blank" rel="nofollow">';

if($tag['tag']=='ftp')
$tag['before']='<a href="go.php?url=$1" class="bbc_ftp new_win" target="_blank" rel="nofollow">';
}
////////////////////////////////////////////////////////////////////////////////

$code = strtr($tag['before'], array('$1' => $data));
$message = substr($message, 0, $pos) . $code . substr($message, $pos2 + ($quoted == false ? 1 : 7));
$pos += strlen($code) - 1;



И все работает, как нужно!

Проще увы, не получается, разработчики очень намудрили с BB-кодом :(.

dmmb


Captain Fizz

Цитата: dmmb от 15 января 2009, 14:17:43
а для 1.7 можешь поправить?

Тебе, судя по всему, это не надо, поскольку ты настолько ленивый, что даже не можешь найти выделенный код в движке 2funny

Код для обоих версий одинаков.

dmmb


bbbbbb

а ссылка которая идет "буквенная" скрывает и идет через go.php или нет?

sdfsdf.com

sdfsdf.comf

"букаенная" - это ссылка где видно только слова, а url скрыта

<a href="go.php?url=$1">go.php?url=$1</a>

<a href="бля-бля-бля">go.php?url=$1</a>

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


Captain Fizz

Так то в варианте Avdenago. Мой вариант работает на всех ссылках, как буквенных, так и просто урлах, включая ftp. Я проверял все возможные сочетания.

Кстати, $1,  про который шли споры в той теме и даже высказывалось мнение что это переменная, на самом деле это не переменная, согласно правилам синтаксиса php переменная языка не может начинаться с цифры.

$1 в контексте Subs.php, это обратная ссылка, которая имеет значение только для регулярных выражений. Это видно при разборе дальнейшего кода.

Это неплохой "финт ушами" со стороны разработчиков, подобные фокусы могут поставить в тупик даже достаточно опытных программистов ;).

Captain Fizz

Чтобы окончательно закрыть эту тему, делаем следующее.

1.Создаем файл go.php:
<?php

ini_set("display_errors",0);
$flog=fopen('logs/outlog.txt','a');
if(isset($url) && strstr($url,'http://')) {
$url=urldecode($_GET['url']);
fwrite($flog,$_SERVER["REMOTE_ADDR"].' - '.date("[d/M/Y:H:i:s]").' '.$_SERVER["REQUEST_URI"].'" "'.$_SERVER["HTTP_REFERER"].'" "'.$_SERVER["HTTP_USER_AGENT"].'" "'.$url."\"\r");
fclose($flog);
header('Location: '.$url);
}
else {
fwrite($flog,$_SERVER["REMOTE_ADDR"].' - '.date("[d/M/Y:H:i:s]").' '.$_SERVER["REQUEST_URI"].'" "" "'.$_SERVER["HTTP_USER_AGENT"].'" "Empty url"'."\r");
fclose($flog);
}

?>


2.Кладем его в корень.

3.Создаем каталог logs с правами 777

4.Кидаем в него .htaccess (для защиты от любопытных глаз :))
Order Allow,Deny
Deny from All


5.Добавляем в robots.txt строку Disallow: /go.php

Теперь в файле logs/outlog.txt находятся все редиректы, кто, когда и куда уходил. Формат файла - стандартный апачский лог, можно просмотреть любым лог-анализатором.


Как вариант - написать мод, который будет складывать всю эту статистику в мускул и сделать для нее доступ из админки. Но мне лень ;)

gash

Цитата: Captain Fizz от 31 января 2009, 20:32:03
Чтобы окончательно закрыть эту тему, делаем следующее.

1.Создаем файл go.php:
<?php

ini_set("display_errors",0);
$flog=fopen('logs/outlog.txt','a');
if(isset($url) && strstr($url,'http://')) {
$url=urldecode($_GET['url']);
fwrite($flog,$_SERVER["REMOTE_ADDR"].' - '.date("[d/M/Y:H:i:s]").' '.$_SERVER["REQUEST_URI"].'" "'.$_SERVER["HTTP_REFERER"].'" "'.$_SERVER["HTTP_USER_AGENT"].'" "'.$url."\"\r");
fclose($flog);
header('Location: '.$url);
}
else {
fwrite($flog,$_SERVER["REMOTE_ADDR"].' - '.date("[d/M/Y:H:i:s]").' '.$_SERVER["REQUEST_URI"].'" "" "'.$_SERVER["HTTP_USER_AGENT"].'" "Empty url"'."\r");
fclose($flog);
}

?>


2.Кладем его в корень.

3.Создаем каталог logs с правами 777

4.Кидаем в него .htaccess (для защиты от любопытных глаз :))
Order Allow,Deny
Deny from All


5.Добавляем в robots.txt строку Disallow: /go.php

Теперь в файле logs/outlog.txt находятся все редиректы, кто, когда и куда уходил. Формат файла - стандартный апачский лог, можно просмотреть любым лог-анализатором.


Как вариант - написать мод, который будет складывать всю эту статистику в мускул и сделать для нее доступ из админки. Но мне лень ;)

а если я не хочу вести лог переходов, нужно удалить эти две строчки?!:
ini_set("display_errors",0);
   $flog=fopen('logs/outlog.txt','a');

virtualband

#8
Как сделать чтобы ссылки на несколько конкретных доменов работали без редиректа?

такая конструкция не работает:

if(!strstr($data,'http://site1.com'))  
{
   if($tag['tag']=='url')................
}

else if(!strstr($data,'http://site2.com'))  
{
    if($tag['tag']=='url')................
}



запрет на редирект происходит только для http://site1.com


-------------------------------------------
спасибо за внимание, уже сам во всем разобрался :)

otshelnik

Буду благодарен, если напишете как реализовать функцию редиректа внешних ссылок для "Версия форума: SMF 1.0.8"

Солярис

А на баннеры это не повлияет? Или ссылки для баннеров будут также идти через редирект?

ILF

После выше сказанных изменений, при нажатии на внешнюю ссылку, у меня открывается та же страница форума в новом окне... Где рыть?
Файл go.php в корень сайта или форума? А каталог logs? (пробовал все варианты)

Солярис

Цитата: ILF от 20 мая 2009, 13:57:29
После выше сказанных изменений, при нажатии на внешнюю ссылку, у меня открывается та же страница форума в новом окне... Где рыть?
Файл go.php в корень сайта или форума? А каталог logs? (пробовал все варианты)
В корень форума, разумеется. Если Вы не хотите вести лог по редиректу, то пропишите в файле "гоу" лишь такой код:
<?php

header
('Location: '.urldecode($_GET['url']));
   
?>

Солярис

Я вот только одного не понял, а ссылки в старых темах все равно будут без редиректа?!

Drakonsa

Цитата: Солярис от 20 мая 2009, 16:15:29
Я вот только одного не понял, а ссылки в старых темах все равно будут без редиректа?!
Почему же без?

Солярис

Ну вот так я у себя на форуме увидел, когда зашел в старую тему.

Солярис

Заметил такую особенность.
Что ссылки, не заключенные в тег [url][/url]
открываются не через редирект, они теперь даже не оформляются, как раньше, вышеуказанным тегом.
Хотелось бы это исправить.

Drakonsa

Автоматическое преобразование ссылок включено? Или ссылки идут тупо текстом?

JustDen

Зачем вообще нужен go.php, разве не проще будет поставить на все внешнии ссылки "<noindex></noindex>"? ???
Inspire me. Surprise me. AMD me.

Солярис

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

Солярис

#20
Цитата: Drakonsa от 24 мая 2009, 01:19:43
Автоматическое преобразование ссылок включено? Или ссылки идут тупо текстом?
Разумеется, включено, ибо как тогда бы ранее (до переделки ссылок через редирект) ссылки автоматически становились активными для нажатия.

То есть, теперь, когда вставляется ссылка без тега "url", она автоматически не обрамляется в этот тег. А в связи с этим, не работает и редирект, который завязан на наличие указанного тега.

Не фига не могу понять, почему вставленные таким образом ссылки, не обрамляются тегом "url"?! В такой ситуации теряется весь смысл редиректа.

BIOHAZARD

читайте эту тему
там всё нормально расписано и всё отлично работает

Цитата: JustDen от 24 мая 2009, 08:07:04
Зачем вообще нужен go.php, разве не проще будет поставить на все внешнии ссылки "<noindex></noindex>"? ???
нет такого тэга "noindex"
Мои моды:
  • RedirectPage
  • Counters
  • CustomSearch
  • SypexDumper
   адаптирую темы    1.1.хx<=>2.0задавая вопросы, старайтесь сразу указывать конечную цель, предполагаемый Вами путь не обязательно окажется самым коротким

Любые моды на заказ

Солярис

Цитата: BIOHAZARD от 24 мая 2009, 11:09:02
там всё нормально расписано и всё отлично работает
Точно?! :-)
Работает даже и в том случае, если ссылки не обрамлены тэгом "url"? Через редирект идут только внешние ссылки?

Цитата: BIOHAZARD от 24 мая 2009, 11:09:02нет такого тэга "noindex"
Я полагаю, что имелся ввиду код.

JustDen

Цитировать
нет такого тэга "noindex"
Да неважно noindex или nofollov. Я просто хочу понять зачем использовать редирект...

http://help.yandex.ru/webmaster/?id=995294#noindex
Может ли робот не индексировать заданные (служебные) участки текста?

Робот Яндекса поддерживает тег noindex, который позволяет решить эту проблему. В начале служебного фрагмента поставьте — <noindex>, а в конце — </noindex>, и Яндекс не будет индексировать данный участок текста. Тег noindex чувствителен к вложенности.
Inspire me. Surprise me. AMD me.

Солярис

#24
Цитироватьтам всё нормально расписано и всё отлично работает
С Вашем решением работает, но только теперь все внутренние ссылки, неоформленные тэегом "iurl", все равно открываются в том же самом окне.
Вот это то, что надо бы подправить.

BIOHAZARD

Цитата: JustDen от 24 мая 2009, 11:42:25
Робот Яндекса поддерживает тег noindex
Кроме него ( и рамы ещё кажется) больше никто этого тега не поддерживает. Более того, страница с этим тэгом не пройдёт валидацию.

Цитата: Солярис от 24 мая 2009, 11:23:35
Точно?! :-)
точно

Цитата: Солярис от 24 мая 2009, 12:49:10
С Вашем решением работает, но только теперь все внутренние ссылки, неоформленные тэегом "iurl", все равно открываются в том же самом окне.
так и задумано было, меня напрягает, когда, переходя внутри одного сайта, ты плодишь кучу окон, другое дело, когда переходишь на внешнюю, тогда логичнее использовать новое окно
но если очень хочется, то можно в моём коде (ссылка на тему выше) заменить в двух местах
<a href="$1">
на
<a href="$1" target="_blank">
Мои моды:
  • RedirectPage
  • Counters
  • CustomSearch
  • SypexDumper
   адаптирую темы    1.1.хx<=>2.0задавая вопросы, старайтесь сразу указывать конечную цель, предполагаемый Вами путь не обязательно окажется самым коротким

Любые моды на заказ

mixman

А как сделать, чтобы при клике на ссылку была белая страница с надписью "вы покидаете сайт" и через секунд 5 перекидывало на саму ссылку? (ну почти как вконтакте.ру)

Drakonsa

Цитата: mixman от 05 июня 2009, 20:53:06
А как сделать, чтобы при клике на ссылку была белая страница с надписью "вы покидаете сайт" и через секунд 5 перекидывало на саму ссылку? (ну почти как вконтакте.ру)
Вот так как написано в первой части только нужный текст вставляете на странице go.php

mixman

пришлось отказаться от мода. с ним отказались работать Highslide Image Viewer и     Aeva ~ Auto-Embed Video & Audio

Drakonsa

Цитата: mixman от 06 июня 2009, 01:26:23
пришлось отказаться от мода. с ним отказались работать Highslide Image Viewer и     Aeva ~ Auto-Embed Video & Audio
Потому что они не попадают под действие url тега

mixman

последний точно попадает...

PS так и не нашел, как сделать на 5 сек "вы покидаете форум"

KenDrive

У меня тут проблема появилась не знаю как решить, код работает прекрасно, как нужно прописывает редирект, но вот только перехода на внешний сайт не происходит, открывается новая пустая страница с адресной строкой вида http://www.myforum.ru/go.php?url=http://www.vneshniysite.ru и всё на этом, хот ьпо идее должен открыться внешний сайт.
Подскажите в чём может быть трабл.

mixman

файл go.php в нужное место разместил?

BIOHAZARD

Цитата: KenDrive от 06 июня 2009, 13:51:22
перехода на внешний сайт не происходит, открывается новая пустая страница с адресной строкой вида http://__www.myforum.ru/go.php?url=http://www.vneshniysite.ru и всё на этом, хот ьпо идее должен открыться внешний сайт.
Содержимое файла?
Мои моды:
  • RedirectPage
  • Counters
  • CustomSearch
  • SypexDumper
   адаптирую темы    1.1.хx<=>2.0задавая вопросы, старайтесь сразу указывать конечную цель, предполагаемый Вами путь не обязательно окажется самым коротким

Любые моды на заказ

KenDrive

Цитата: mixman от 06 июня 2009, 14:00:18
файл go.php в нужное место разместил?
в корень форума
Цитата: BIOHAZARD от 06 июня 2009, 15:12:36
Содержимое файла?
вот, в точности как и в данном топике
<?php

   ini_set
("display_errors",0);
   
$flog=fopen('logs/outlog.txt','a');
   if(isset(
$url) && strstr($url,'http://'))   {
      
$url=urldecode($_GET['url']);
      
fwrite($flog,$_SERVER["REMOTE_ADDR"].' - '.date("[d/M/Y:H:i:s]").' '.$_SERVER["REQUEST_URI"].'" "'.$_SERVER["HTTP_REFERER"].'" "'.$_SERVER["HTTP_USER_AGENT"].'" "'.$url."\"\r");
      
fclose($flog);
      
header('Location: '.$url);
   }
   else   {
      
fwrite($flog,$_SERVER["REMOTE_ADDR"].' - '.date("[d/M/Y:H:i:s]").' '.$_SERVER["REQUEST_URI"].'" "" "'.$_SERVER["HTTP_USER_AGENT"].'" "Empty url"'."\r");
      
fclose($flog);
   }

?>


UPD

Проблема решена, оказывается почему то выше указанный код в go.php не работал, а заменив его на
<?php

header
('Location: '.urldecode($_GET['url']));
   
?>


Всё заработало, только лог теперь вестись не будет.

Drakonsa

В первом коде нету перенаправления, только запись в файл, поэтому и не перенаправлял.

mixman

как подружить этот мод с модом Auto-Embed Video & Audio (Aeva) ?

Kombat76

Изменил все файлы в соответствии с Вашими рекомендациями. Подскажите, как теперь  определить,работет ли редирект ссылок. Визуально это как то отображается в окне браузера? А то по наведению на ссылку отображается ссылка на внешний ресурс. (папку с логами не создавал, использовал упрощенный вариант кода go.php)

BIOHAZARD

Цитата: Kombat76 от 05 августа 2009, 17:58:30
по наведению на ссылку отображается ссылка на внешний ресурс.
значит не работает
Мои моды:
  • RedirectPage
  • Counters
  • CustomSearch
  • SypexDumper
   адаптирую темы    1.1.хx<=>2.0задавая вопросы, старайтесь сразу указывать конечную цель, предполагаемый Вами путь не обязательно окажется самым коротким

Любые моды на заказ

Гад

А полноценного мода для этого дела ещё не придумали? :)

Чтоб обрамлял ссылки в метатеги noindex (для Яндекса) и nofollow (для Гугла). Остальные ПС не интересуют.
И при этом в админке можно было ввести список урлов-исключений.

К куче движков уже есть подобные плагины/моды, а для SMF ещё не видел, к сожалению :(

digger®

Цитата: Гад от 14 сентября 2009, 18:41:59
А полноценного мода для этого дела ещё не придумали? :)

Чтоб обрамлял ссылки в метатеги noindex (для Яндекса) и nofollow (для Гугла). Остальные ПС не интересуют.
И при этом в админке можно было ввести список урлов-исключений.

К куче движков уже есть подобные плагины/моды, а для SMF ещё не видел, к сожалению :(

Тут всего два варианта

1. Написать такой мод самому.
2. Заплатить кому-то чтобы написали.

BIOHAZARD

Мои моды:
  • RedirectPage
  • Counters
  • CustomSearch
  • SypexDumper
   адаптирую темы    1.1.хx<=>2.0задавая вопросы, старайтесь сразу указывать конечную цель, предполагаемый Вами путь не обязательно окажется самым коротким

Любые моды на заказ


Гад

И сколько будет стоить такое чудо? :)

Может кто тоже желает подобное, скинемся по 5-10$, и нам приятно, и программеру работа :)

Цитата: digger от 15 сентября 2009, 06:02:38
И чего все так из-за ссылок трясутся...
Меньше внешних ссылок - выше пузомерки. Да и чем меньше дозволено, тем меньше спама.

digger®

Цитата: Гад от 15 сентября 2009, 06:32:12
И сколько будет стоить такое чудо? :)

Может кто тоже желает подобное, скинемся по 5-10$, и нам приятно, и программеру работа :)

Можно подумать, если есть желающие проспонсировать.

Солярис

Никак не могу понять одну особенность работы редиректа.

На одном форуме файл go.php выглядит вот так:
<?php
header
('Location: '.urldecode($_SERVER['QUERY_STRING']));
?>

Все работает отлично.

При этом все ссылки оформляются следующим образом:
http://www.ляляля.ru/go.php?http://тратата.ру

+++++++++++++++

На другом форуме вышеуказанный вариант не работал. Пришлось файл go.php изменить:
<?php

header
('Location: '.urldecode($_GET['url']));
   
?>


При этом ссылки отображаются вот таким образом:
http://www.ляляля.ru/go.php?url=http://тратата.ru/index.php?topic=5881.0

Интересует, почему редирект на втором форуме не работал в первом варианте? И почему изначально перенаправление на другой сайт оформлялось иначе - кодом go.php?url= (дополнительно вставляется url=)
При этом редирект вставлял в оба форума одинаковым образом. Но вот их работа почему-то различается.

BIOHAZARD

второй форум не на виндовс хостинге случаем?
Мои моды:
  • RedirectPage
  • Counters
  • CustomSearch
  • SypexDumper
   адаптирую темы    1.1.хx<=>2.0задавая вопросы, старайтесь сразу указывать конечную цель, предполагаемый Вами путь не обязательно окажется самым коротким

Любые моды на заказ


Гад

Тема снова ожила, это хорошо :)

Столкнулся с неожиданной проблемой.
Возможно ли заставить работать go.php с включенным ЧПУ? Проблема в том, что встроенная функция дружественных урлов несколько страшна и непродумана, как по мне. Все ссылки идут через "папку" index.php/, таким образом вышеописанным методом редирект должен происходить через:
http://форум.ру/index.php/go.php?url=http://ссылка
Но в каталог index.php нельзя положить файл go.php, поскольку линукс не дает создавать файл и папку с одинаковым именем в одном каталоге.

Как же всё-таки решить, не отключая ЧПУ?

Drakonsa

Цитата: Гад от 04 ноября 2009, 15:54:56
Тема снова ожила, это хорошо :)

Столкнулся с неожиданной проблемой.
Возможно ли заставить работать go.php с включенным ЧПУ? Проблема в том, что встроенная функция дружественных урлов несколько страшна и непродумана, как по мне. Все ссылки идут через "папку" index.php/, таким образом вышеописанным методом редирект должен происходить через:
http://форум.ру/index.php/go.php?url=http://ссылка
Но в каталог index.php нельзя положить файл go.php, поскольку линукс не дает создавать файл и папку с одинаковым именем в одном каталоге.

Как же всё-таки решить, не отключая ЧПУ?
index.php?action=go&url=http://ссылка