CGI - Common Gateway Interface
Спецвыпуск хакер, номер #002, стр. 002-068-3
Итак, готовься! Держись крепче, не расплескай пиво. Собственно скрипты (бурные аплодисменты в зале, чей-то нервный кашель, характерная отрыжка и сигаретная вонь)! CGI-программа в виде *.cgi должна начинаться со строки, указывающей, на каком именно языке она написана. Для этого пишут примерно такую строчку:
#!/usr/local/bin/perl
Здесь /usr/local/bin - это каталог, в котором находится интерпретатор Perl`а. Обычно, что в каком каталоге находится, можно узнать из FAQ, который предоставляет место под твою хоумпагу. Дальше, чтобы что-то вывести - отдать браузеру, нужно сначала вывести специальный заголовок, по которому браузер или еще какой юзерский клиент определит, что именно ему отдают:
print "Content-type: text/html\n\n";
Это означает, что скрипт будет отдавать HTML-страничку. Например, вот так:
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<html><body>\n";
print "<h1>Это скрипт!</h1>\n";
print "</body></html>";
Результат налицо - то есть на лице браузера. Можно отдавать просто текстовые файлы - для этого в "Content-type" нужно указать не "text/html", а "text/plain":
print "Content-type: text/plain\n\n";
Здесь же можно указать кодировку документа:
print "Content-type: text/plain; charset=ISO-8859-4\n\n";
Иногда очень удобно, в зависимости от какого-то события, либо выдавать страничку, либо перенаправлять пользователя на другой сайт (или другую страничку). Для этого можно воспользоваться заголовком Location:
print "Location: http://www.another site.com\n\n";
И сервер просто перекинет браузер на другой сервер. Можно указать также какой-то документ "поблизости". Тогда просто будет обработан он - без переброски:
print "Location: /../pages/index.htm\n\n";
Можно отдавать не только странички и текстовые файлы, но и бинарники - архивы, Mp3-шки и так далее. Для этого тоже нужно указать свой заголовок:
print "Accept-Ranges: bytes\n";
print "Content-Length: $size\n";
print "Content-Disposition: filename=$filename\n";
print "Content-type: bin/bin\n\n";
В этом примере в переменной $size находится размер файла, а в $filename - точное расположение файла, который нужно скормить браузеру. Что, тяжко идет? Ничего, пельмень, немного практики, и все будет круто.
Параметры
Приведу небольшой пример, как правильно обработать параметры в Perl`е. Если что непонятно - милости прошу читать Learning Perl, писать мне письма (расскажу ЕЩЕ подробней, что к чему) или посещать www.citforum.ru - там же, кстати, есть и подробное описание "спецификации клиент-сервер шлюзов CGI":
if ($ENV{"REQUEST_METHOD"} eq "GET") {
$data = $ENV{"QUERY_STRING"}
}
else {