Скрипт HTTP-редиректа предназначен для учета перехода посетителей сайта по ссылкам.

Автор: Guga Сайт: http://guga.chat.ru
   
   Он ведет лог-файл с указанием даты, IP посетителя и ID ссылки. Ведение лог-файла может быть отключено с сохранением собственно функции редиректа. Это может быть полезно, если у Вас есть доступ к лог-файлам Вашего сервера, в которых будет информация о переходах на САМ скрипт редиректа.
   В любом случае - для учета внешних ссылок редирект нужен для "локализации" внешних ссылок, т.е. чтобы, уходя по внешней ссылке, посетитель оставлял об этом след на Вашем сайте.
   
   
   КОД СКРИПТА:
   
   #!/usr/bin/perl
   
   $rderr="rd_error.txt";
   $rderr_answer="rderror.html";
   
   $log=1;
   $rdlog="rdlog.txt";
   $links="links.txt";
   $lockfile="rdlock.tmp";
   $lockfile2="rdelock.tmp";
   ##############################################
   
   $query=$ENV{'QUERY_STRING'};
   $ldate=scalar localtime;
   $ip=$ENV{'REMOTE_ADDR'};
   
   foreach $item(split(/&/,$query)) {
    ($name,$value)=split (/=/,$item);
    $value=~tr/+/ /;
    $value=~ s/%(..)/pack("c",hex($1))/ge;
    $PARAM{$name}=$value;
   };
   
   open FL,"<$links";
   @vector=;
   close FL;
   
   foreach $line(@vector){
   chomp $line;
   ($name,$value)=split (/=/,$line);
   $v{$name}=$value;
   }
   $id=$PARAM{'id'};
   
   $URL=$v{$id};
   if ($URL ne "")
   {
   if ($log==1){
   if ( -e "$lockfile")
   {for ($wait=0;$wait<100;$wait++)
   {if ( -e "$lockfile") {sleep .2;} else{goto wrtlog;};}
   goto nowrtlog;
   };
   wrtlog:
   open TMP,">$lockfile"; close TMP;
   open LOG,">>$rdlog";
   print LOG "\"$ip\" \"$ldate\" \"$id\"\n";
   close LOG;
   unlink "$lockfile";
   nowrtlog:
   }
   print "HTTP/1.1 302 Moved Temporarily\n";
   print "Content-Type: text/html\n";
   print "Location: $URL\n\n";
   }
   else
   {
   if ( -e "$lockfile2")
   {for ($wait=0;$wait<100;$wait++)
   {if ( -e "$lockfile2") {sleep .2;} else{goto wrtelog;};}
   goto nowrtelog;
   };
   wrtelog:
   open ETMP,">$lockfile2"; close ETMP;
   open ERLG,">>$rderr";
   print ERLG "\"$ip\" \"$ldate\" \"$id - ID unknown\"\n";
   close ERLG;
   unlink "$lockfile2";
   nowrtelog:
   print "HTTP/1.1 200 OK\n";
   print "Content-Type: text/html\n\n";
   open ER,"rderror.html";
   @txt=; close ER;
   foreach $row(@txt){print $row;}
   }
   
   
   ОПИСАНИЕ:
   
   =======================================================================
   1. Назначение и особенности скрипта
   =======================================================================
   Скрипт для редиректа предназначен для учета перехода по определенным ссылкам Вашего сайта, например, по внешним (ведущим на другие сайты). Учет происходит следующим образом: 1. Пользователь переходит по внешней ссылке, которая фактически ведет на скрипт редиректа; 2. Скрипт записывает в свой лог-файл запись о переходе и перенаправ- ляет пользователя на нужный URL. Переадресация браузера пользователя "на уровне протокола HTTP" позво- ляет максимально сократить время перехода по ссылке. Этот скрипт является nph-скриптом (полностью формирующим HTTP-ответ браузеру).
   =======================================================================
   2. Установка скрипта
   =======================================================================
    1. Запишите в файл links.txt информацию обо всех учитываемых сайтах в следующем формате: (ID_сайта)=(URL_сайта) где URL_сайта - URL учитываемой ссылки; ID_сайта - идентификатор соответствующего URL. Этот идентификатор должен быть уникальным в пределах данного списка. Это может быть любое сочетание букв, цифр или просто порядковый номер. При переходе пользователя по ссылке вызывается скрипт редиректа, которому в качестве параметра передается ID сайта, и посетитель направляется на URL, соответствующий данному ID. информация о каждом сайте должна быть записана на отдельной строке. 2. Настройте редирект в соответствии с Вашими потребностями, как это описано в разделе 3; 3. Измените файл rderror.html; 4. Разместите скрипт (nph-rd.cgi) и другие файлы (links.txt, rderror.html, rd-error.txt, rdlog.txt) в Вашу cgi-bin директорию и уста- новите права доступа (на исполнение - для nph-rd.cgi, на чтение - links.txt и rderror.html, на чтение/запись - для остальных файлов). 5. На Ваших HTML-страницах ссылки на учитываемые скриптом URL-ы записывайте следующим образом: ... где /cgi-bin/nph-rd.cgi - адрес Вашего скрипта редиректа. ID - идентификатор URL, на который должен перейти пользователь по этой ссылке.
   =======================================================================
   3. Назначение переменных настройки.
   =======================================================================
   $rderr - имя лог-файла ошибок; $rderr_answer - имя html-файла, который выдается пользователю при ошибке редиректа; обратите внимание, что html-файл должен находиться в каталоге cgi-bin ! $log =1 - вести лог-файл переходов по ссылкам; 0 - не вести лог-файл переходов. Последнее значение может быть целесообразно, если Ваш хостинг-провайдер предоставляет Ваи доступ к лог-файлам Вашего сервера. В этом случае в лог-файлах сервера будут записываться все обращения _к скрипту редиректа_ и, соответственно, необходимость в ведении отдельного лог-файла отпадает. $rdlog - имя лог-файла переходов. Имеет смысл, если $log = 1; $links - имя файла ссылок. $lockfile и $lockfile2 - временные файлы блокировки доступа в лог-файлы переходов и ошибок соответственно. Единственное требование к именам этих файлов - файлов с таким именем не должно быть в директории на сервере, где находится и работает скрипт. Если другие скрипты используют аналогичный метод блокировки одновременной записи, имена этих файлов у разных скриптов должны различаться.
   =======================================================================
   4. Форматы лог-файлов
   =======================================================================
   Строки лог-файла переходов по ссылкам: "IP_адрес_посетителя" "Дата_и_время" "ID" Строки лог-файла ошибок: "IP_адрес_посетителя" "Дата_и_время" "Описание_ошибки" В настоящее время скрипт воспринимает ошибку только при передаче ему неизвестного ID (не существующего в файле links.txt).
   =======================================================================
   5. Сообщения об ошибках, отзывы и предложения автору
   =======================================================================
   Автор надеется, что представленный здесь скрипт и сопутствующие материалы не содержат ошибок и будут корректно работать в любой ситуации, но не дает на этот счет каких-либо гарантий. Скрипт поставляется бесплатно "как есть". Если Вы столкнулись с ошибкой в скрипте во время его использования, пожалуйста, сообщите об этом автору. При этом возможно более точно опишите проявление ошибки. Это поможет выпустить следующую версию скрипта, не содержащую этой ошибки.
   
   
   
   
   

Опубликовано: HTTP://WWW.R-T-F-M.INFO, pauk ©® 2000-2011.
All rights reserved.
При перепечатки ссылка на сайт обязательна.
Мнение администрации сайта не всегда совпадает с мнением автора..