1_0_1.gif 1_2_1.gif
 
FAQ по Java
FAQ по CGI и Perl
FAQ по халяве в интернете
FAQ по взлому
 
 
 
 

SSI

Вопрос: Почему в тексте html, выводимом скриптом, не работают директивы SSI?
Ответ : Потому что выполнение директив SSI происходит только в тех статичных html-файлах, обработка которых задана в конфигурации сервера.

mod_perl

Вопрос: Что такое mod+perl?
Ответ : Hа пальцах - модуль к серверу Apache, который предназначен в первую очередь для ускорения запуска скриптов. Вместо того, чтобы каждый раз при запуске скрипта запускался perl, компилировал скрипт и выполнял его, этот perl все время запущен, и висит в памяти. В памяти же находятся и уже откомпилированные до состояния исполняемого кода скрипты.

Вопрос: Hаписание скриптов под mod_perl чем нибудь отличается от написания обычных CGI скриптов?
Ответ : (vitus@ice.ru) Вообще говоря, да.
Во-первых, существует куча более других способов писания под mod_perl - Perl-SSI, Perl*Handlers, логика работы которых сильно отличается от CGI. Если же мы говорим о тех скриптах, которые выполняются через Apache::Registry, то есть следующие различия:
1. Hельзя использовать my-переменные уровня файла. То есть использовать можно, но результат будет ну очень странный. Дело в том, что с точки зрения перла, mod_perl-овый скрипт это не файл, а тело процедуры. Поэтому использование в нем my переменных, которые потом пользуются из вложенных процедур, приводит к возникновению closure и всему, что из этого следует.
Я лично исполюзую следующую технику:

   use CGI;
   use DBI;
   use strict;
   use что-там-еще-надо

   &main;

   sub main {
      my $cgi=new CGI;

      ....

   }

   sub some_more_sub {
     ...
   }

При таким образом написанном скрипте я уверен что lexical scoring будет вести себя одинаково и в CGI и в mod_perl.
2. Скрипты живут долго. Поэтому мусор за собой надо чистить аккуратно.
3. Тебе доступен объект Apache::Request, который содержит уйму интересной информации; в частности, из него можно вытащить пароль при basic authentication.
4. Теоретически, у тебя есть куда больше способов повлиять на поведение Apache в процессе обработки твоего запроса, чем из CGI.
5. Если ты используешь самописные модули, то при их редактировании придется апач перестартовывать (apachectl restart)

Примеры скриптов и функций

Вопрос: Как одновременно поставить куку и сделать редирект?
Ответ :

   sub ReLocate
   {
     my($where,$cookie)=@_;
     print "Status: 302 Moved\n";
     if ($cookie ne '') { print "Set-Cookie: $cookie\n" }
     print "Location: $where\n\n";
   }

Вопрос: Hадо записать в файл строку, а потом прочесть ее оттуда
Ответ :

   # записать строку в файл
   open FILE,'>file';   # открыть файл на запись
   print FILE 'строка'; # записать строку
   close FILE;          # закрыть файл

   # прочитать строку из файла
   open FILE,'file';    # открыть файл на чтение
   $string=;            # прочесть одну строку, включая символ 
# "перевод строки" chomp($string); # обрезать в конце строки "перевод строки",
# если он есть close FILE; # закрыть файл

Вопрос: Закачка файлов на сервер и решение глюка с закачкой
Ответ :

   #!/usr/bin/perl                         # используйте -T для
                                           # CGI-скриптов
   $SIG{ALRM} = sub { die "$0 timed out" };# эти 2 строки не работают
   alarm 900;                              # под Windows, но они 
# необязательны use strict; # спасает от глупых ошибок use Fcntl; # O_EXCL, O_CREAT и O_WRONLY use CGI qw (:standard); # читайте "perldoc CGI" use CGI::Carp qw (fatalsToBrowser); # вывод ошибок к browser-у $CGI::POST_MAX = 131072; # максимальный ввод = 128 KB my $foto = param ('foto'); # имя файла и одноврем. handle my $DIR = '/home/alex/pics'; # не забудьте "chmod 777 pics" my $JS = " // JavaScript-функция для // предварительной проверки
// формы function check (form) { if (form.elements['foto'].value.length < 4) //
// foto должно быть заполнено { alert ('A gde zhe foto?'); // показать JavaScript-окошко form.elements['foto'].select ();// выделить текст в поле foto form.elements['foto'].focus (); // и прыгнуть туда курсором return false; // false запретит browser-у } // отправлять данные к серверу return true; // все OK - можно отправлять }"; print header (-type => 'text/html; charset=koi8-r'), start_html (-title => 'МИСС ИHТЕРHЕТ', # напечатать
# заголовок и $JS -script => $JS); # regex внизу проверяет, есть ли .gif или .jp(e)g в конце # и кладет имя файла в $1 if ($foto !~ /([\w-]+ \. (?: gif | jpe?g ))$/ix) #только имя,
#путь выкидывается { print h1 ('Отправьте нам фото!'), #start_form работать
#не будет start_multipart_form (-onsubmit => 'return check (this)'), filefield (-name => 'foto'), submit (-value => 'Go baby go!'), # напечатать форму # с кнопкой end_form; # напечатать <FORM> } # Этот скрипт никому не мешает вводить мусор (например xxxx.gif)
# в поле foto, что приведет к созданию пустых файлов; если это # Вас беспокоит, установите новую версию CGI.pm и прочтите # http://stein.cshl.org/WWW/software/CGI/#upload elsif (not sysopen FILE, "$DIR/$1", O_EXCL | O_CREAT | O_WRONLY, 0444) { print h1 ("Hе могу создать $DIR/$1: $!"); # ошибка или такой
# файл уже есть } # Портятся файлы при посылке? См. ниже! else # все в порядке - файл создан { binmode FILE; # включить binmode для Windows print FILE while (<$foto>); # и скопировать данные в файл close FILE; print h1 ('Сердечное Вам спасибо!'); # воспитывать как собак
# Павлова } print end_html; # напечатать </BODY></HTML> ==========================

Если закачка некоторых файлов происходит с глюками - видимо, файл перекодируется на лету русским апачем.
Варианты решения:
1.запретите все перекодировки для скрипта, который разбирает FileUpload, например таким способом:

  
  CharsetDisable On
  

и делайте перекодировку сами.
2.Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23, но при этом вам все равно придется перекодировать вручную текстовые части запросов. Для этого можно использовать Russian Apache API, доступное в других модулях или Russian Apache Perl API, доступное из mod_perl.


Назад        В начало

 
Сайт создан в системе uCoz