WebMaster/Programming/Perl/
Переменные среды 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)
HTTP_HOST
Имя хоста к которому обращается браузер. Так как
физически на одном сервере может находиться сразу много серверов
(Виртуальные Хосты), то должен быть способ сообщить серверу к
какому именно идет обращение. Скрипт же может тоже в зависимости
от этой переменной производить различные действия, таким если
он используется на сайтах сразу нескольких виртуальных хостов.
Пример:HTTP_HOST=www.nnov.city.ru
Ну,начнем применять на практике усвоеные уроки.
#!/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 "<I><B>HTTP_HOST</B></I>=$ENV{'HTTP_HOST'}<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 ,содержащий
#!/bin/sh
#mkcgi
chmod +x *.cgi
и сделайте его в свою очередь исполняемым chmod
+x mkcgi -он сильно упростит вам жизнь.
Ну а теперь запускайте скрипт......
Изучив информацию,выдаваемую данным скриптом вы сможете лучше
ориентироваться в переменных окружения CGI.