Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Документация, учебники по Perl.doc
Скачиваний:
3
Добавлен:
29.10.2018
Размер:
2 Мб
Скачать
☆

Итак ...Приступим...

Краткие сведения о том что надо знать чтоб писать CGI скрипты: Ну вопервых надо знать что такое интернет и как он работает (а вы знаете? ;))) ) Ну и чуть-чуть умения прграмировать(это самое главное) Давайте вместе писанем какой нибудь простенький скриптик а потом я вам расскажу где сдесь собака порылась.... Ну сначала в своем домашнем каталоге создайте директорию cgi-bin: cd public_html mkdir cgi-bin chmod 0777 cgi-bin Последняя строчка будет очень важна. Возьмите редактор и наберите:

#!/usr/bin/perl

#first.cgi

print "Content-Type: text/html\n\n";

print "<HTML><BODY>";

print "<H1>Hello you!!!</H1>";

print "</BODY></HTML>";

Сохраните его в директории cgi-bin под именем first.cgi .Ну как сохранили? А теперь сделайте его исполняемым(ведь это программа): chmod +x first.cgi Ну вот,подходим к торжественному моменту.... наберите в строке браузера http://www.uic.nnov.ru/~твой_логин/cgi-bin/first.cgi и посмотрите чо будет. Будет одно из двух ,либо скрипт заработает и вы увидите сгенерированую им страничку (поздравляю,в нашем полку прибыло!) либо Internal Server Error -тогда не расстраивайтесь,вы что-то сделали не так. Вам тогда пригодится пособие по ловле блох. Ну вопервых проверку синтаксиса можно осуществить следующим образом: perl -с first.cgi Perl вам сразу выдаст либо сообщения об ошибках(ну бывает,точку с запятой пропустили, скобочки или кавычки забыли закрыть...) это сразу по ходу дела поправимо. Более грубая с логической точки зрения это пропустить вывод пустой строки, которая отделяет заголовок от тела:

print "Content-Type: text/html\n\n"; #Все Правильно

print "Content-Type: text/html\n"; #ОШИБКА!!!

Разберем скрипт: Первая строка #!/usr/bin/perl Просто указывает где в системе расположен Perl. Вторая это просто коментарий -вы можете тыкать чо угодно после знака # Затем идет print "Content-Type: text/html\n\n"; Это заголовок указывающий тип содержимого все что скрипт печатает в свой стандартный вывод STDOUT идет на обработку к серверу. Пустая строка отделяет заголовок от тела,которое в нашем случае представляет собой <HTML><BODY> <H1>Hello you!!!</H1> </BODY></HTML> Сервер обработает ответ скрипта и на базе него сформирует и пошлет браузеру ответ.(Сервер обычно не изменяет тела сообщения,он только дополняет заголовок нужными для протокола HTTP полями) Ну вот азы уже освоены,все не так трудно и удручающе как могло показаться на первый раз Вы теперь можете сами потренироваться в написании таких вот простеньких скриптов чтоб набить руку.

Переменные среды cgi

Предыдущий скрипт не содержал ничего особенно замечательного,так просто вываливал HTMLый текст который благополучно и отбражался на екране браузера.Но По настоящему мощь придает CGI возможность обработки параметров,которые переданы скрипту.например вы можете набрать http://www.somehost.ru/somedir/cgi-bin/my_cgi.cgi?param=value то есть вы хотите чтоб скрипт my_cgi.cgi обработал для вас параметер param со значением value (ну это например) или когда вы заполнили запрос в форме (в например yahoo или altavista).Ну это с точки зрения пользователя... А на сервере при запуске CGI-скрипта сервер формирует среду окружения в которой скрипт может найти всю доступную информацию о HTTP-соединении и о запросе. Вот эти переменные: REQUEST_METHOD

Это одно из самых главных поле используемое для определения метода запроса HTTP Протокол HTTP использует методы GET и POST для запроса к серверу.Они отличаются тем что при методе GET запрос является как-бы частью URL т.е. http://www..../myscript.cgi?request а при методе POST данные передаются в теле HTTP-запроса (при GET тело запроса пусто) и следовательно для CGI тоже есть различие при GET запрос идет в переменную QUERY_STRING а при POST подается на STDIN скрипта. Пример:REQUEST_METHOD=GET

QUERY_STRING

Это строка запроса при методе GET. Вам всем известно что запрос из формы кодируется браузером поскольку не все символы разрешены в URL некоторые имеют специальное назначение. Теперь о методе urlencode: неплохо бы чисто формально напомнить,что все пробелы заменяются в URL на знак '+', а все специальные и непечатные символы на последовательность %hh ,где hh-шестнадцатиричный код символа,разделитель полей формы знак '&',так что при обработке форм надо произвести декодирование. Пример:QUERY_STRING= name=quake+doomer&age=20&hobby=games

CONTENT_LENGTH

Длина в байтах тела запроса.При методе запроса POST необходимо считать со стандартного входа STDIN CONTENT_LENGTH байт,а потом производить их обработку.Обычно методом POST пользуются для передачи форм,содержащих потенциально большие области ввода текста TEXTAREA.При этом методе нет никаких ограничений,а при методе GET существуют ограничения на длину URL . Пример:CONTENT_LENGTH=31

CONTENT_TYPE

Тип тела запроса(для форм кодированых выше указаным образом он application/x-www-form-urlencoded)

GATEWAY_INTERFACE

Версия протокола CGI. Пример:GATEWAY_INTERFACE=CGI/1.1

REMOTE_ADDR

IP-Адрес удаленого хоста,делающего данный запрос. Пример:REMOTE_ADDR=139.142.24.157

REMOTE_HOST

Если запрашивающий хост имеет доменное имя,то эта переменная содержит его, в противном случае -тот же самый IP-адресс что и REMOTE_ADDR Пример:REMOTE_HOST=idsoftware.com

SCRIPT_NAME

Имя скрипта,исполизованое в запросе.Для получения реального пути на сервере используйте SCRIPT_FILENAME Пример:SCRIPT_NAME=/~paaa/guestbook.cgi

SCRIPT_FILENAME

Имя файла скрипта на сервере. Пример:SCRIPT_FILENAME=/home/p/paaa/public_html/cgi-bin/guestbook.cgi

SERVER_NAME

Имя серера ,чаще всего доменное как www.microsoft.com ,но в редких случаях за неимением такового может быть IP-адресом как 157.151.74.254 Пример:SERVER_NAME=www.uic.nnov.ru

SERVER_PORT

TCP-Порт сервера используюшийся для соединения .По умолчаниию HTTP-порт 80, хотя может быть в некоторых случаях другим. Пример:SERVER_PORT=80

SERVER_PROTOCOL

Версия протокола сервера. Пример:SERVER_PROTOCOL=HTTP/1.1

SERVER_SOFTWARE

Програмное обеспечение сервера. Пример:Apache/1.0

AUTH_TYPE, REMOTE_USER

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

Переменные заголовка HTTP-запроса. За исключением тех строк из заголовка HTTP-запроса которые были включены в другие переменные,сервер приделывает строкам префикс HTTP_ и заменяет знаки '-' на '_': HTTP_ACCEPT

Давая запрос на сервер браузер обычно расчитывает получить информацию определеного формата,и для этого он в заголовке запроса указывает поле Accept:,Отсюда скрипту поступает cписок тех MIME,которые браузер готов принять в качестве ответа от сервера. Пример:HTTP_ACCEPT=text/html,text/plain,image/gif

HTTP_USER_AGENT

Браузер обычно посылает на сервер и информацию о себе,чтоб базируясь на знании особеностей и недостатков конкретных браузеров CGI-скрипт мог выдать информацию с учетом этого. Например,разные браузеры могут поддерживать или не поддерживать какие-то HTMLые тэги. Пример:HTTP_USER_AGENT=Mozila/2.01 Gold(Win95;I)

Ну,начнем применять на практике усвоеные уроки.

#!/usr/bin/perl

#vars.cgi

sub urldecode{ #очень полезная функция декодирования

local($val)=@_; #запроса,будет почти в каждой вашей CGI-программе

$val=~s/\+/ /g;

$val=~s/%([0-9A-H]{2})/pack('C',hex($1))/ge;

return $val;

}

print "Content-Type: text/html\n\n";

print "<HTML><HEAD><TITLE>CGI-Variables</TITLE></HEAD>\n";

print "<BODY>\n";

print "Enter here something:<ISINDEX><BR>\n";

print "Your request is:$ENV{'REQUEST_STRING'}<BR>\n";

print "Decoded request is:urldecode($ENV{'REQUEST_STRING'})<BR>\n";

print "<HR>\n";

print "Variables:<BR>\n";

print "<I><B>REQUEST_METHOD</B></I>=$ENV{'REQUEST_METHOD'}<BR>\n";

print "<I><B>QUERY_STRING</B></I>=$ENV{'QUERY_STRING'}<BR>\n";

print "<I><B>CONTENT_LENGTH</B></I>=$ENV{'CONTENT_LENGTH'}<BR>\n";

print "<I><B>CONTENT_TYPE</B></I>=$ENV{'CONTENT_TYPE'}<BR>\n";

print "<I><B>GATEWAY_INTERFACE</B></I>=$ENV{'GATEWAY_INTERFACE'}<BR>\n";

print "<I><B>REMOTE_ADDR</B></I>=$ENV{'REMOTE_ADDR'}<BR>\n";

print "<I><B>REMOTE_HOST</B></I>=$ENV{'REMOTE_HOST'}<BR>\n";

print "<I><B>SCRIPT_NAME</B></I>=$ENV{'SCRIPT_NAME'}<BR>\n";

print "<I><B>SCRIPT_FILENAME</B></I>=$ENV{'SCRIPT_FILENAME'}<BR>\n";

print "<I><B>SERVER_NAME</B></I>=$ENV{'SERVER_NAME'}<BR>\n";

print "<I><B>SERVER_PORT</B></I>=$ENV{'SERVER_PORT'}<BR>\n";

print "<I><B>SERVER_PROTOCOL</B></I>=$ENV{'SERVER_PROTOCOL'}<BR>\n";

print "<I><B>SERVER_SOFTWARE</B></I>=$ENV{'SERVER_SOFTWARE'}<BR>\n";

print "<I><B>HTTP_ACCEPT</B></I>=$ENV{'HTTP_ACCEPT'}<BR>\n";

print "<I><B>HTTP_USER_AGENT</B></I>=$ENV{'HTTP_USER_AGENT'}<BR>\n";

print "<HR>\n";

print "All enviroment:<BR>\n";

foreach $env_var (keys %ENV){

print "<I>$env_var=$ENV{$env_var}</I><BR>\n";

}

print "</BODY></HTML>\n";

Так как все ваши .cgi -файлы должны быть исполняемыми то чтоб облегчить себе жизнь заведите себе в директории cgi-bin командный файл mkcgi ,содержащий

chmod +x *.cgi

и сделайте его в свою очередь исполняемым chmod +x mkcgi -он сильно упростит вам жизнь. Ну а теперь запускайте скрипт...... Изучив информацию,выдаваемую данным скриптом вы сможете лучше ориентироваться в переменных окружения CGI.