Создание серверных приложений на языке PERL

WWW,CGI-специфика


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


  • При попытке запустить скрипт происходит 500 Internal Server Error! Что это за ошибка?


  • Как узнать IP человека, вызвавшего скрипт?


  • Как узнать, с какой страницы идет ссылка на скрипт?


  • Как узнать IP прокси, если через нее запустили скрипт?


  • А можно ли узнать IP юзера, запустившего скрипт через прокси?


  • А какие еще значения есть у этого %ENV?




  • Как запускать скрипт на сервере через определенные промежутки времени, или в определенное время суток, день недели, месяц?


  • Как, зная ip, получить имя (DNS), за которым этот ip закреплен?


  • Что такое method GET, и что такое method POST?


  • Как обрабатывать параметры, переданные скрипту?


  • Посоветуйте халявный хостинг с поддержкой CGI-perl.


  • Что надо указатьв заголовках HTTP-ответа CGI скрипта, выводящего содержимое, которое надо не показать на экране, а сохранить в файле с заданным именем, например 'download.zip' ? А то браузер сохраняет файл с именем скрипта.


  • Директивы SSI не обрабатываются в выводе скрипта. Что делать?



  • print "Ok";

    Обратите внимание на двойной перевод строки в конце заголовка.

    (*)Примечание:

    Если у вас нет доступа к логу ошибок сервера, для отладки скрипта используйте

    директиву use CGI::Carp qw (fatalsToBrowser); В этом случае при фатальной ошибке, приводящей к завершению скрипта, эта ошибка будет видна вам в браузере.

    Q: Как узнать IP человека, вызвавшего скрипт?

    A: $ENV{'REMOTE_ADDR'}

    Q: Как узнать, с какой страницы идет ссылка на скрипт?

    A: $ENV{'HTTP_REFERER'}

    Q: Как узнать IP прокси, если через нее запустили скрипт?

    A1 $ENV{'HTTP_VIA'}

    A2: Hекоторые прокси добавляют в конец заголовка строку типа

    ", via ProxyName", и в результате вместо переменной HTTP_VIA эту строку можно

    наблюдать в конце переменной $ENV{'HTTP_USER_AGENT'}

    Q: А можно ли узнать IP юзера, запустившего скрипт через прокси?

    A: $ENV{'HTTP_X_FORWARDED_FOR'}. Hо не все прокси обеспечивают IP сидящего за

    ними юзера. "Честные" прокси,- у провайдеров, например,- это делают. А

    некоторые халявные (анонимные) прокси-сервера, могут и не показывать IP сидящего "за" ними пользователя.

    Q: А какие еще значения есть у этого %ENV ?

    A: for (keys %ENV) { print "$_ = ${ENV{$_}}\n" }

    A1: То же самое, но по-другому записанное (более "перловое" решение):

    print join("
    ",map("$_ = $ENV{$_}", keys %ENV));

    Q: Как запускать скрипт на сервере через определенные промежутки времени, или

    в определенное время суток, день недели, месяц?

    A: Это возможно, если есть шелл-доступ на сервер. Читайте man crontab

    Q: Как, зная ip, получить имя (DNS), за которым этот ip закреплен?

    A: Встроенная функция gethostbyaddr()

    Q: Что такое method GET, и что такое method POST?

    A1: rfc2616

    A2: GET - передача параметров скрипту из строки location браузера. Пример:

    script.cgi?mode=aa&type=bb&length=12

    Минусы этого метода:

    1. Все параметры видны в строке. Если в кач-ве параметров передается пароль

    - получается дырка в безопасности



    2. Длина данных, передаваемых таким методом, ограничена.

    3. Hельзя передавать multipart form data, в т.ч. файлы через кнопочку

    "Browse"

    POST - передача данных скрипту через STDIN. Отсутствуют минусы метода GET.

    Обычно метод GET используется, когда скрипт вызывается со страницы через линк

    , а POST - при нажатии кнопки submit в форме.

    О получении параметров внутри скрипта читайте в следующем Q.

    Q: Как обрабатывать параметры, переданные скрипту?

    A1: Используйте модуль CGI. Прочтите perldoc CGI , а для начала простой

    пример:


    use CGI;

    $q=new CGI();

    $mode=$q->param('mode');

    $q - объект, который имеет несколько методов и полей, относящихся к

    параметрам вызова, переменным окружения, cookie, и пр. В $mode содержится значение параметра 'mode'.


    или проще: use CGI qw/:standard/;

    $mode=param('mode'); если вам не нужно несколько объектов.


    A2: Некоторые предпочитают пользоваться библиотекой cgi-lib (она тоже входит в модуль CGI, хотя существуют индивидуумы, которые включают ее отдельным файлом).

    Пример:

    use CGI qw(:cgi-lib);

    ReadParse(); #Функция возвращает все параметры в хэш.

    $mode=$in{'mode'};

    A3: Можно пойти по пути изобретения велосипеда и начать переписывать модуль CGI, т.е. разбор параметров метода GET, потом наверняка понадобиться POST, а потом multipart form data. В написанный код закрадуться ошибки, которые придется отлавливать на последующих этапах. Это конечно дает неплохую практику программирования, но лучше просто посмотрите как написан модуль CGI.

    (Высказанное в последнем ответе является тем самым ИМХО ).

    Q: Посоветуйте халявный хостинг с поддержкой CGI-perl.

    A:www.virtualave.net

    free.prohosting.com

    www.hypermart.net

    www.virtualave.net

    www.webservis.ru

    www.h1.ru

    www.holm.ru

    www.hut.ru

    Примечание:

    В последнее время почти все халявные хостинги перестали поддерживать исходящие запросы, т.е. скачать откуда-нибудь файл используя LWP или Net::Ftp не получиться.

    Если знаете хостинг с поддержкой исходящих запросов, напишите мне, буду благодарен.

    Q: Что надо указатьв заголовках HTTP-ответа CGI скрипта, выводящего

    содержимое, которое надо не показать на экране, а сохранить в файле с заданным

    именем, например 'download.zip' ? А то браузер сохраняет файл с именем скрипта.

    A: print "Content-Type: application/octet-stream\nContent-Length: ", -s 'download.zip' ,"\n";

    print "Content-Disposition: attachment; filename=download.zip\n\n";

    Q: Директивы SSI не обрабатываются в выводе скрипта. Что делать?

    A: Есть специальный модуль - CGI::SSI.


    Содержание раздела