» √лавна€
eXcode.ru » —татьи » Web » ¬ведение в CGI
» Ќовости
» ќпросы
» ‘айлы
» ∆урнал



ѕользователей: 0
√остей: 2





ѕрименение методов доступа HTTP в рамках программировани€ CGI-скриптов. Ќастройка HTTP-сервера дл€ работы с CGI-скриптами




ћетод доступа GET

ћетод доступа GET долгое врем€ был основным методом доступа из форм к CGI-скриптам. Ёто происходило по причине отсутстви€ при вводе большого количества данных и из-за пр€мого обращени€ к скриптам по их URL. ¬ насто€щее врем€ ситуаци€ мен€етс€, но тем не менее данный метод занимает едва ли не главное место в программировании обработки данных из HTML-форм.

”словно использование GET можно разбить на два способа:

  • запросы типа isindex ;
  • запросы типа form-urlencoded .

¬ первом случае имитируетс€ или реально происходит передача запроса, который по€вл€етс€ при вводе данных в строке приглашени€ контейнера ISINDEX. ¬о втором случае происходит передача пар "им€_пол€=значение". » в том, и в другом случае данные, не вход€щие в кодировку Latin1, преобразуютс€ в пары шестнадцатеричных символов, предвар€емых символом "%" (%20 Ч пробел).

 роме вызова скрипта непосредственно из гипертекстовой ссылки, скрипт можно запустить и через Server Side Includes. ¬ этом случае данные из формы будут приписыватьс€ к URL документа, а не скрипта. —крипт при этом будет вызыватьс€ сервером при разборе текста HTML-страницы перед отправкой ее клиенту.

 роме собственно запроса, который в методе GET по€вл€етс€ в URL после символа "?", скрипту еще можно передать информацию в HTTP-пути. Ёто переменна€ окружени€ PATH_INFO . ќбработка данных из этой переменной требует особого подхода к их получению и использованию в скрипте и гипертекстовых ссылках.

«апрос isindex

«апрос типа isindex €вл€етс€ исторически первым способом передачи данных от браузера серверу . ќн был разработан дл€ передачи списка ключевых слов дл€ поисковой машины. «апрос данного типа по€вл€етс€ либо в случае использовани€ контейнера ISINDEX, либо при пр€мом обращении к скрипту через гипертекстовую ссылку. ƒанный тип запроса имеет р€д особенностей, которые отличают его от запроса типа form-urlencoded.

ѕри использовании контейнера ISINDEX в начале документа по€вл€етс€ шаблон ввода ключевых слов. ѕосле ввода списка слов, разделенных пробелом, вызываетс€ скрипт, который принимает список, разбирает его на отдельные слова и выполн€ет необходимую обработку. ѕервоначально isindex был ориентирован на модуль, подключавший поисковую систему WAIS к серверу CERN. ѕосле по€влени€ спецификации CGI стало возможным передавать списки слов любому CGI-скрипту. «апрос типа isindex определен только дл€ метода доступа GET .

—огласно спецификации CGI дл€ метода GET запрос присоедин€етс€ к URL документа или скрипта (указан атрибут ACTION в контейнере ISINDEX) после символа "?"(getis2.htm):

 http://localhost/htdocs/isindex.htm?search+
       engine+world+wide+web
   

или

http://localhost/htdocs/isindex.cgi?search+
       engine+world+wide+web
   

 ак видно из этого примера, в запросе пробел замен€етс€ на символ "+". ѕричем буквы русского алфавита в таком запросе перекодировать не надо, они передаютс€ как есть. ≈сли пользователь работает с локализованной версией операционной среды, то все будет отображатьс€ так, как положено. ¬ случае нелокализованной версии операционной среды, например, Windows NT, буквы будут отображатьс€ абракадаброй, но в скрипт будут передаватьс€ правильные коды.

“радиционно в GET данные запроса выбираютс€ из переменной окружени€ QUERY_STRING. Ќапример, это можно сделать на Perl следующим образом:

   #!/usr/local/bin/perl
   print "Content-type: text/plain

";
   print "«апрос: $ENV{QUERY_STRING}.
";
   

¬ данном примере первый оператор печати формирует заголовок HTTP-сообщени€ в соответствии со спецификацией CGI. ¬торой оператор печати распечатывает содержание переменной окружени€ QUERY_STRING. √лавное при этом Ч разделить запрос на отдельные слова, чтобы можно было использовать их в качестве ключей поиска. ¬ Perl дл€ этого существует функци€ split:

   #!/usr/local/bin/perl
   print "Content-type: text/plain

";
   print "«апрос: $ENV{QUERY_STRING}.
";
   @words = split(′+′,$ENV{QUERY_STRING});
   foreach $word (@words)
   {
   print $word,"
";
   }
   

¬ данном случае следует обратить внимание на то, что в запросе нет никаких имен полей Ч только введенные слова и их разделители. ≈стественно, если среди введенных символов встретитс€ разделитель, он будет заменен шестнадцатеричным.

” запроса isindex есть еще одно замечательное свойство Ч это передача данных в командной строке CGI-скрипта. ќчевидно, что ввести аргументы пользователь не в состо€нии (у него нет удаленного терминала), но вот прин€ть данные из командной строки скрипт может:

   #!/usr/local/bin/perl
   print "Content-type: text/plain

";
   print "«апрос: $ENV{QUERY_STRING}.
";
   $n = @ARGV;
   for($i=0;$i<$n;++$i)
   {
   print $ARGV[$i],"
";
   }
   

¬нешне результаты работы данного скрипта и скрипта разбора QUERY_STRING ничем не отличаютс€. Ќо данные они получают из разных источников (getis6.htm).

«апрос типа isindex не порождаетс€ событием onSubmit, как это происходит в запросах form-urlencoded . ќн €вл€етс€ одной из разновидностей схемы http универсального локатора ресурсов (URL). ѕри использовании обычной контекстной гипертекстовой ссылки (контейнер A (anchor)) запрос просто дописываетс€ вслед за символом "?".

ѕри программировании на JavaScript обратитьс€ к скрипту через запрос isindex можно либо путем изменени€ значени€ атрибута HREF в одном из элементов массива гипертекстовых ссылок документа, либо путем вызова метода replace() объекта Location.

«апрос form-urlencoded

¬ методе GET запрос типа form-urlencoded €вл€етс€ основной формой запроса. ќт запроса типа isindex он отличаетс€ форматом и способом передачи, точнее, кодировкой данных в теле HTTP-сообщени€. ƒанные формы попадают в запрос, который расшир€ет URL скрипта в виде пар "им€_пол€=значение&им€_пол€=значение&...". Ќапример, дл€ формы вида:

   <FORM ACTION=test.cgi METHOD=get>
   ѕоле1:<INPUT NAME=f1 VALUE=value1>
   ѕоле2:<INPUT NAME=f2 VALUE=value2>
   <INPUT TYPE=submit VALUE="ѕослать">
   </FORM>
   

запрос в сообщении HTTP-протокола будет выгл€деть следующим образом:

   GET /test.cgi?f1=value1&f2=value2 HTTP/1.0
   

Ќесмотр€ на то, что в форме имеетс€ три пол€, переданы будут значени€ только двух полей. Ёто св€зано с тем, что у третьего пол€ в форме нет имени. ≈сли у пол€ нет имени, то его значение не передаетс€ серверу . Ёто правило общее дл€ всех полей. „аще всего оно примен€етс€ дл€ полей подтипов submit и reset типа text.

ѕрименение неименованных полей позвол€ет передавать в скрипт только ту информацию, котора€ реально требуетс€ дл€ выполнени€ обработки данных. »ногда неименованные пол€ примен€ют и при программировании на JavaScript.

 роме формата в запросе типа form-urlencoded , данные, введенные в форму, подвергаютс€ дополнительной обработке Ч кодированию.

 одирование, собственно, и дало название методу (urlencoded). —огласно спецификации, текстовое сообщение не может содержать символы, не вход€щие в набор Latin1. Ёто означает, что втора€ половина таблицы ASCII и первые 20 символов должны быть закодированы. ¬ CGI символ кодируетс€ как две шестнадцатеричные цифры, следующие за знаком "%". ƒл€ российских Web-узлов это означает, что скрипт, который принимает запрос, должен предварительно перекодировать все шестнадцатеричные эквиваленты в символы (getform2.htm). Ќа Perl это можно реализовать в одну строку:

   query =~ s/%(.{2})/pack(′c′,hex($1))/ge;
   

¬ данном случае мы осуществл€ем глобальную подстановку (оператор "=~ s///"), который употреблен с модификаторами "ge". ѕервый модификатор обозначает глобальную замену по всей строке query, а второй требует выполнени€ перед заменой выражени€ "pack(′c′,hex($1))". Ѕолее подробно о программировании на Perl см. раздел "¬ведение в программирование на Perl".

ѕередача параметров через PATH_INFO

ѕередача данных в скрипты возможна не только при помощи переменной окружени€ QUERY_STRING или аргументов командной строки скрипта. ѕередать параметры в скрипт можно через переменную окружени€ PATH_INFO. ƒанна€ переменна€ принимает свое значение после преобразовани€ URL скрипта. –ассмотрим следующий URL:

   http://localhost/cgi-bin/test/arg1/arg2/arg3?param1+param2
   

—огласно спецификации URI адрес ресурса делитс€ на две части: название схемы адресации и путь к ресурсу:

схемаразделительпуть к ресурсу
http://localhost/cgi-bin/test/arg1/arg2/arg3?param1+param2

схема адресации задаетс€ протоколом обмена данными. ќбращение к скрипту осуществл€етс€ по схеме http. ¬ свою очередь, в схеме http путь снова делитс€ на две части: адрес ресурса и параметры. Ёти части разделены символом "?". ѕараметры могут быть записаны либо в форме isindex, либо в формате form-urlencoded:

адрес ресурсаразделительпараметры
//localhost/cgi-bin/test/arg1/arg2/arg3?param1+param2

јдрес ресурса в случае обращени€ к скрипту снова можно разделить на две части Ч адрес скрипта и путевой параметр PATH_INFO:

адрес скриптаPATH_INFO
//localhost/cgi-bin/test/arg1/arg2/arg3

¬ данном случае €вного разделител€ между адресом скрипта и PATH_INFO нет. ƒеление определ€етс€ настройками сервера . ” большинства серверов стандартным каталогом CGI-скриптов €вл€етс€ каталог cgi-bin. ѕри этом подразумеваетс€, что все файлы этого каталога Ч скрипты. ћожно даже указать файл с расширением html, который в данном случае будет интерпретироватьс€ как скрипт (getpath1.htm). «начение путевого параметра сервер помещает в переменную окружени€ PATH_INFO. ѕри этом в нее попадает и лидирующий символ "/".

”правление работой скрипта через путевой параметр довольно попул€рно. Ќапример, при выполнении перенаправлени€, когда нужно собирать статистику обращений к ресурсам, расположенным вне Web-узла:

   http://localhost/cgi-bin/banner/
     	http://otherhost/page.html
   

¬ообще говор€, при таких перенаправлени€х возникает опасность Web-спуффинга. —уществует очень больша€ веро€тность, что администратор не заметит подмены одной из частей такого URL.

PATH_INFO примен€етс€ не только в совокупности с каталогами скриптов, но и с любым скриптом, определенным пользователем. „асто в качестве такого скрипта определ€ютс€ файлы с расширением *.cgi:

   http://www.intuit.ru/~user/script.cgi/path_param/test?arg1+arg2
   

¬ этом примере в переменную PATH_INFO попадет /path_param/test.

ћетод доступа POST и другие методы доступа

ћетод POST Ч это второй основной метод доступа к информационным ресурсам Web-узла. ќн €вл€етс€ альтернативой методу GET . ¬ообще, при HTTP-обмене используютс€ три основных метода: GET , POST и HEAD. ѕервые два предназначены дл€ получени€ страниц. —траницы при этом передаютс€ в виде тела HTTP-отклика. ѕри методе GET от клиента к серверу отправл€етс€ запрос, состо€щий только из заголовка HTTP-сообщени€. ¬се введенные пользователем данные размещаютс€ в URL документа. ѕри методе POST от клиента к серверу уходит запрос, который состоит из заголовка и тела HTTP-сообщени€. ѕри этом данные, введенные пользователем, размещаютс€ в теле запроса. ћетод HEAD примен€етс€ только дл€ управлени€ обменом и отображением. ¬ рамках данного метода тело HTTP-сообщени€ не передаетс€ как клиентом в запросе, так и сервером в отклике.

ќсновное назначение метода POST Ч передача сравнительно больших объемов данных от клиента к серверу . ѕрименение этого метода оправдано при передаче сложных состо€щих из множества полей форм. ¬ спецификации CGI от NCSA рекомендуетс€ использовать метод POST при передаче данных из форм, содержащих пол€ textarea.

—овременное использование Web в качестве альтернативы FTP-архивам расширило свойства метода POST . “ак, большинство архивов научной периодики построено по принципу их обновлени€ авторами статей. ƒл€ этой цели используютс€ страницы с формами, содержащими пол€ типа File-upload. Ётот механизм позвол€ет передать на сервер файл любого размера и любого типа. ѕри этом сами пользователи не получают Web-account на сервере архива, они пользуютс€ стандартным скриптом публикации.

»з перечисленных выше методов только POST формирует тело сообщени€. ¬ спецификации CGI речь при этом идет только об HTTP-сообщени€х. Ќо современные браузеры Ч это мультипротокольные программы. ѕри этом в качестве гипертекстовых ссылок можно использовать различные схемы. ¬о многих протоколах, на которые эти схемы указывают, нет пон€ти€ метода доступа. “ем не менее в контейнере FORM такой метод можно использовать, например, со схемой mailto. ¬ данном случае ни по какому методу POST , который не определен в протоколе SMTP, ничего не передаетс€. POST просто заставл€ет браузер создать тело, в данном случае, почтового сообщени€.

„тение данных из стандартного потока ввода

ѕри передаче запроса по методу POST от клиента к серверу передаетс€ HTTP-сообщение, которое состоит из заголовка и тела. ƒанные, введенные в HTML-форму, как раз и составл€ют тело сообщени€. ѕри обработке такого запроса CGI-скриптом данные следует выбирать из стандартного потока ввода скрипта, а не из переменной окружени€ QUERY_STRING. Ёта переменна€ будет иметь пустое значение.

ƒл€ того, чтобы прин€ть данные, нужно прочитать стандартный поток ввода. ѕри этом из стандартного потока ввода нужно считать строго определенное количество байтов. „исло байтов определ€етс€ переменной окружени€ CONTENT_LENGTH. ¬ Perl прием данных в скрипт можно организовать следующим образом:

   #!/usr/local/bin/perl
   read STDIN,$query,$ENV(CONTENT_LENGTH);
   

«десь из стандартного потока ввода STDIN считываетс€ $ENV(CONTENT_LENGTH) данных и помещаетс€ в переменную $query. ѕосле этого можно уже что-то делать с запросом, например, распечатать его в виде HTML-таблицы.

јналогично можно прин€ть запрос из стандартного ввода и в —. ƒл€ этого следует воспользоватьс€ в простейшем случае функцией getchar():

   #include <stdlib.h>
   #include <malloc.h>
   void main()
   {
   int n,i;
   char *buff;
   n = atoi(getenv("CONTENT_LENGTH");
   buff = (char *) malloc(n+1);
   memset(buff,′00′,n+1);
   for(i=0;i<n;i++)
   {
   buff[i] = getchar();
   }
   printf("Content-type: text/plain

");
   printf("Length of data into STDIN:%d
",n);
   printf("STDIN data: %s
",buff);
   free(buff);
   }
   

ѕосимвольное чтение в этом примере можно заменить чтением по функции fread(). ѕри этом не следует ожидать существенного уменьшени€ времени чтени€ данных. ¬о-первых, данные при вводе буферизуютс€. ¬о-вторых, в — примен€етс€ потокова€ модель работы с внешними наборами данных.

ѕередача присоединенных файлов

ћетод POST позвол€ет реализовать передачу файлов с компьютера пользовател€ в архив на HTTP- сервере . ƒл€ этой цели разработана специальна€ форма кодировани€ тела документа: multipart/form-data. ќна указываетс€ в контейнере FORM в атрибуте ENCTYPE совместно с методом POST :

   <FORM ENCTYPE=multipart/form-data 
        METHOD=post>
   

—крипт, который принимает такие данные, должен определить метод доступа, затем определить тип тела документа и только после этого начать разбирать тело. ¬ теле может быть как минимум две части: значени€ различных полей, которые доставл€ютс€ скрипту в первой части сообщени€, и тело передаваемого файла, которое передаетс€ как втора€ часть сообщени€.

ѕол€ разбираютс€ по традиционной схеме. Ёто обычные ASCII-символы. — ними никаких проблем не возникает. “ело документа передаетс€ как есть, т.е. без преобразований. Ёто значит, что примен€ть дл€ его выделени€ текстовые функции — нельз€, т.к. внутри документа могут попадатьс€ любые символы, в том числе и символы конца символьного массива (строки).

„тобы убедитьс€ в этом, достаточно просто распечатать данные, посланные браузером. ƒл€ приема данных и их разбора нужно либо написать собственную программу, либо воспользоватьс€ готовыми программами и библиотеками €зыка Perl, например.

ќчевидно, что метод POST с пол€ми file-upload используетс€ дл€ опубликовани€ данных на стороне сервера . ѕри этом файл, который передаетс€ по сети, должен быть размещен в файловой системе либо сервера , либо другого удаленного компьютера. ƒл€ этого пользователь, от имени которого запускаетс€ скрипт, должен иметь соответствующие права на доступ к каталогу файловой системы компьютера, в который записываетс€ файл. ƒовольно часто модули стандартных библиотек, например, CGI_Lite или CGI.pm, используют дл€ временного хранени€ каталог /tmp. »ногда данный каталог закрывают на запись, из-за чего могут возникнуть проблемы с приемом данных скриптом, составленным из модулей стандартной библиотеки.

—тандартные библиотеки разбора данных

–азбор запроса по методу POST CGI-скриптом Ч это рутинна€ процедура. ѕри запросе типа urlencoded нужно просто выделить имена полей и их значени€, а при запросе типа multipart/form-data Ч выделить части составного тела запроса и преобразовать их в имена полей, их значени€ и файлы.

— 1995 года было написано достаточно много заготовок дл€ такого разбора, которые оформлены в виде свободно распростран€емых библиотек. Ќаиболее попул€рными €вл€ютс€ библиотеки модулей Perl Ч CGI.pm и CGI_Lite.

CGI.pm Ч полный набор функций дл€ генерации HTML-файлов с формами и разбора запросов CGI-скриптами.

CGI_Lite Ч это средство работы с составными (multipart/form-data) запросами. ѕри работе с функци€ми данного модул€ следует иметь в виду, что временные файлы эти функции размещают в каталоге /tmp.

ћетод доступа PUT и другие способы использовани€ CGI-скриптов

 роме стандартных способов использовани€ CGI-скриптов, т.е. приема запросов от браузеров по методам GET и POST , скрипты примен€ютс€ и дл€ решени€ р€да других задач.   таким задачам можно отнести обслуживание расширенного набора методов доступа, например, PUT и DELETE.

 роме того, дл€ исполнени€ скриптов сам HTTP- сервер должен быть настроен соответствующим образом. ¬ конфигурации по умолчанию сервера Apache предполагаетс€, что все стандартные скрипты будут размещатьс€ в каталоге ~server_root/cgi-bin, а скрипты пользовател€ будут иметь расширение *.cgi.

≈сли эксплуатируетс€ только один Web-узел, этих настроек вполне достаточно. ≈сли же на одной вычислительной установке эксплуатируетс€ несколько виртуальных Web-узлов, то дл€ каждого из них следует дополнительно определ€ть и каталоги стандартного размещени€, и расширени€ по умолчанию, и методы обработки нестандартных методов доступа.

Ќередко CGI-скрипты примен€ютс€ в качестве подстановок SSI на стороне сервера . —хема проста: HTML-документ используетс€ как шаблон, в котором HTML-комментарии задают команды подстановок. ¬ зависимости от различных условий сервер , который обрабатывает эти документы перед отправкой клиенту (браузеру), вставл€ет в шаблон результаты выполнени€ команд подстановок, в частности CGI-скриптов.

ѕреимущество CGI-скриптов в данном случае заключаетс€ в том, что они работают с переменными окружени€ , порожденными сервером дл€ скрипта, а не с системными переменными окружени€ . Ёто позвол€ет включить механизмы анализа IP-адреса клиента, его доменного имени или cookie, чего нельз€ сделать при работе с обычным набором переменных окружени€ , который порождаетс€ операционной системой.

Ќастройки сервера дл€ работы с CGI-скриптами

ƒл€ исполнени€ CGI-скриптов сервер Apache должен быть соответствующим образом настроен. ¬о-первых, он должен быть собран с модулем исполнени€ CGI-скриптов (обычно включен по умолчанию), во-вторых, в файлах настройки сервера следует указать опции управлени€ исполнением CGI-скриптов.

¬ данном разделе мы будем подразумевать, что сервер собран с модулем исполнени€ CGI-скриптов, поэтому обратимс€ сразу к настройкам сервера .

¬ верси€х Apache, начина€ с 1.2.6 можно все директивы настроек сервера включать в один файл httpd.conf. ќднако традиционный способ настройки , который унаследован от NCSA- сервера , предполагает использование трех файлов настройки , которые отвечают за:

  • настройку самого сервера (httpd.conf);
  • настройку ресурсов Web-узла (srm.conf);
  • настройку управлени€ доступом к ресурсам (access.conf).

ƒл€ виртуальных хостов все директивы размещаютс€ в файле httpd.conf в разделах описани€ каждого из виртуальных хостов.

httpd.conf

¬ этом файле определ€ютс€ скрипты обработки нестандартных методов доступа (PUT или DELETE), а также описани€ работы с CGI-скриптами дл€ виртуальных хостов.

ƒл€ указани€ скрипта обработки нестандартного метода используют директиву Script:

   Script PUT put_script.cgi
   

¬место PUT здесь можно указать DELETEили другой метод доступа. ѕри обращении по данному методу доступа будет вызван скрипт, который указан в качестве второго аргумента.

ƒирективы дл€ описани€ работы со скриптами дл€ виртуальных хостов размещают внутри контейнера VirtualHost:

   <VirtualHost>
   ...
   </VirtualHost>
   

¬нутрь этого контейнера можно помещать все директивы, которые размещают дл€ основного сервера в файлах httpd.conf, srm.conf, access.conf.

srm.conf

¬ этом файле определ€етс€ конфигураци€ ресурсов, которыми управл€ет сервер . —крипты вход€т в состав этих ресурсов.  аталог скриптов по умолчанию определ€ет директива ScriptAlias:

   ScriptAlias cgi-bin 
        /usr/local/etc/httpd/cgi-bin
   

¬ данном каталоге определ€етс€ синоним части URL (первый параметр директивы), которому ставитс€ в соответствие реальный путь в каталоге файловой системы вычислительной установки, где эксплуатируетс€ сервер (второй аргумент). Ќапример:

   http://server.intuit.ru/cgi-bin/test.cgi
   

обращаетс€ к файлу

   /usr/local/etc/httpd/cgi-bin/test.cgi
   

 роме стандартного места размещени€ скриптов, которое определ€етс€ через ScriptAlias, скрипты можно хранить в произвольном каталоге, внутри дерева каталогов сервера .

ƒерево каталогов сервера определ€етс€ директивой DocumentRoot:

   DocumentRoot /www/host.ru/htdocs
   

или

   DocumentRoot htdocs
   

¬ первом случае указан полный путь, от корн€ файловой системы, а во втором Ч относительный путь, т.е. путь от домашнего каталога сервера .

ƒл€ того, чтобы можно было запускать скрипты, нужно добавить handler (обработчик) дл€ запуска скриптов из заданного каталога:

   SetHandler cgi-script
   

 роме того, с расширением файла можно св€зать MIME-тип, по которому сервер распознает скрипт:

   AddType application/x-www-form-urlencoded .pl
   

¬ данном случае мы назначаем расширение *.pl дл€ CGI-скриптов. “радиционным расширением скриптов по умолчанию €вл€етс€ расширение *.cgi.

access.conf

Ќаиболее важной директивой в этом файле с точки зрени€ исполнени€ скриптов €вл€етс€ Options. ќна используетс€ внутри контейнера Directory:

   <Directory /usr/local/etc/httpd/htdocs>
   Options ExecCGI
   </Directory>
   

¬ данном случае дл€ каталога /usr/local/etc/httpd/htdocs будет разрешено исполнение CGI-скриптов.

—крипты дл€ обработки нестандартных методов доступа

ƒл€ того, чтобы обработать метод доступа, отличный от GET или POST , необходимо выполнить несколько условий: подготовить скрипт дл€ обработки данного метода, настроить сервер и определить соответствующие права доступа к каталогам, с которыми этот скрипт будет работать. –ассмотрим как это делаетс€ на примере обработки запроса по методу PUT.

Ќекоторые серверы , например IIS компании Microsoft, имеют встроенные модули дл€ работы с методом PUT. —ервер Apache такого модул€ в стандартной комплектации не имеет, но позвол€ет подключить скрипт дл€ обработки запросов по методу PUT.

—ама программа обработки таких запросов может выгл€деть следующим образом:

   #!/usr/local/bin/perl
   if($ENV{REQUEST_METHOD} ne "PUT")
   {
   die "Content-type: text/plain

ћетод доступа не PUT";
   }
   $fname=$ENV{PATH_TRANSLATED};
   if(!$fname)
   {
   die "Content-type: text/plain

Ќе указана мишень вывода";
   }
   $length=$ENV{CONTENT_LENGTH};
   if(!$length)
   {
   die "Content-type: text/plain

—траница имеет нулевой размер";
   }
   read(STDIN,$page,$length);
   open(OUT,">$fname");
   print OUT $page;
   close(OUT);
   print "Content-type: text/plain

ƒанные получены.";
   
Ћистинг 24.1.

ѕервый оператор if провер€ет метод доступа, второй Ч адрес страницы, которую следует разместить, третий Ч наличие самих данных дл€ размещени€ по адресу страницы. ѕроверок дл€ полной уверенности в передаче данных на самом деле нужно выполнить несколько больше.  роме того, требуетс€ сгенерировать код возврата и запись в журнал посещений, чтобы этот пример стал реально действующей программой. “еперь нужно настроить сервер . ƒл€ этого в файле конфигурации сервера httpd.conf следует указать:

   Script PUT cgi-сценарий
   

«десь cgi-сценарий Ч это им€ нашего скрипта.

ѕосле этого дл€ нашего сценари€, а, точнее, дл€ пользовател€, от которого он запускаетс€, нужно разрешить запись данных в каталог размещени€ страниц и, если это необходимо, внести изменени€ в файлы настройки процедуры аутентификации.

—крипты и Server Side Includes

—тандартный модуль подстановок (includes) сервера Apache позвол€ет задействовать CGI-скрипты дл€ генерации подстановок. —крипт, в отличие от обычной программы, наследует переменные окружени€ , которые генерирует сервер дл€ CGI-скриптов, а не стандартный набор переменных окружени€ оболочки (shell).

   <!--#exec cgi="/cgi-bin/include.cgi" -->
   

¬ данном случае мы вставили в документ результат работы скрипта include.cgi.

¬ставку можно использовать и не дл€ генерации части текста документа, а дл€ анализа данных, передаваемых в страницу или дл€ анализа переменных окружени€ CGI-скрипта, т.е. условий обращени€ к странице. Ќапример, дл€ анализа IP-адреса пользовател€ и условного перенаправлени€ запроса.

ƒл€ того, чтобы сервер выполнил подстановки в файл srm.conf, нужно внести строку определени€ типа документов, подлежащих разбору (server parsed documents):

   AddType text/x-server-parsed-html .shtml
   

–асширение файла *.shtml обычно используетс€ дл€ документов, требующих анализа их содержани€ на предмет выполнени€ подстановок. ≈сли администратор желает распространить предварительный анализ содержани€ документов на все документы, то вместо или в дополнение к .shtml можно указать и .html.

 роме того, дл€ каталога (файл access.conf Ч общий файл конфигурации доступа или .htaccess Ч файл конфигурации доступа, расположенный в данном каталоге и переопредел€ющий правила доступа), в котором расположены документы в директиве Options, должны быть разрешены и подстановки, и исполнение CGI-скриптов:

   <Directory /usr/local/etc/httpd/htdocs>
   AllowOverride
   Options Includes ExecCGI
   </Directory>
   

¬ данном случае дл€ домашнего каталога документов сервера Apache, который используетс€ в настройках по умолчанию, разрешено переопредел€ть опции доступа в подкаталогах (AllowOverride) и исполн€ть подстановки и скрипты (Options Includes ExecCGI). ѕо умолчанию обычно используют вместо последних двух опций одну Ч All. ќна тоже разрешает подстановки и выполнение скриптов, а также р€д других действий:

   <Directory /usr/local/etc/httpd/htdocs>
   AllowOverride
   Options All
   </Directory>
   

¬ообще говор€, существует возможность разрешить подстановки, но запретить выполнение скриптов:

   <Directory /usr/local/etc/httpd/htdocs>
   AllowOverride
   Options IncludesNoExec
   </Directory>
   

¬ этом случае отключаютс€ не только скрипты, но и обычные команды, выполн€емые из стандартной оболочки (shell). ѕри этом можно разрешить исполнение скриптов самих по себе, но не в качестве вставок.

   <Directory /usr/local/etc/httpd/htdocs>
   AllowOverride
   Options IncludesNoExec ExecCGI
   </Directory>
   

¬ данной конфигурации исполнение скриптов разрешено, а выполнение подстановки по команде exec запрещено.

  началу статьи





ƒобавил: MadvEXƒата публикации: 2006-02-20 17:59:34
–ейтинг статьи:4.50 [√олосов 2] ол-во просмотров: 42805

 омментарии читателей

¬сего комментариев: 5317

2018-08-16 14:15:14
RichardHog
–Ѓ—А–Є–і–Є—З–µ—Б–Ї–∞—П –Ї–Њ–љ—Б—Г–ї—М—В–∞—Ж–Є—П —О—А–Є—Б—В–∞ –≤ –Ч–∞–њ–Њ—А–Њ–ґ—М–µ

<a href=https://lawyer-1014.business.site/>–Ш—Б–Ї–Њ–≤–Њ–µ –Ј–∞—П–≤–ї–µ–љ–Є–µ –Њ —А–∞—Б—В–Њ—А–ґ–µ–љ–Є–Є –±—А–∞–Ї–∞ –Є –≤–Ј—Л—Б–Ї–∞–љ–Є–Є –∞–ї–Є–Љ–µ–љ—В–Њ–≤</a>

2018-08-16 13:00:52
Jamesbon
–Ї–≤–∞—А—В–Є—А—Л –≤ –Є–њ–Њ—В–µ–Ї—Г —Б–±–µ—А–±–∞–љ–Ї–∞ –њ–Њ –≥–Њ—Б–њ—А–Њ–≥—А–∞–Љ–Љ–µ —П—А–Њ—Б–ї–∞–≤–ї—М

<a href=http://info.1cont.ru/contragent/ao-aizhk-jao/>–Њ—Ж–µ–љ–Ї–∞ –љ–µ–і–≤–Є–ґ–Є–Љ–Њ—Б—В–Є –≤ —П—А–Њ—Б–ї–∞–≤–ї–µ –і–ї—П –Є–њ–Њ—В–µ–Ї–Є</a>

2018-08-16 11:55:51
Michaelnus
—Г—В—П–≥–Є–≤–∞—О—Й–µ–µ –ґ–µ–љ—Б–Ї–Њ–µ –±–µ–ї—М—С —Ж–µ–љ—Л

<a href=https://www.instagram.com/p/BjsbUAXHG-2/>–≤ —А–Њ—Б—В–Њ–≤–µ —Г—В—П–≥–Є–≤–∞—О—Й–µ–µ –±–µ–ї—М–µ</a>

2018-08-16 11:54:26
Davidanots
–Є—А—А–Є–≥–∞—В–Њ—А –і–ї—П —А—В–∞ –Ї—Г–њ–Є—В—М

<a href=http://ypag.ru/cat/news0/page0.html>–Є—А—А–Є–≥–∞—В–Њ—А –і–ї—П –Ј—Г–±–Њ–≤</a>

2018-08-16 02:03:31
game_u3797
<img src="https://b.radikal.ru/b01/1808/46/3b52633fe4a8.jpg">


<b>—истемные требовани€:</b>
<b>ќ—:</b> Windows 7/8/8.1/8.2/10
<b>ƒоп.ѕќ:</b> Net Framework 3.5 и выше
<b>–азмер:</b> до 1 мб
<b>√од выпуска:</b> 2018

—качать: http://rgho.st/89YMK8gs6
—качать: https://cloud.mail.ru/public/AYRS/7LH2sHBbe

2018-08-15 17:02:31
DanielNuP
https://kadastr-city.ru
<a href=https://kadastr-city.ru/kadastrovye-raboty/>кадастровые работы</a>
<a href=https://kadastr-city.ru/kadastrovye-raboty/uslugi-kadastrovogo-inzhenera-pod-klyuch/>кадастровый инженер</a>

2018-08-15 12:33:49
Willieacafe
<a href=https://mobi-dengi.com/>лайф</a>

2018-08-15 12:25:46
CarlosRox
<a href=http://gorokna-nn.ru>купить пластиковое окно в нижнем новгороде</a>

2018-08-15 04:15:39
DonaldHap
<a href=https://ivagrupp.ru>шплинт нержавеющий</a>

2018-08-14 23:19:14
JamesBub
<a href=https://mobi-dengi.com/>пополнить киевстар</a>
¬аше им€: *
“екст записи: *
»м€:

ѕароль:



–егистраци€

 ак вы относитесь к спаму?
ѕоложительно, я сам спамер.
11% (21)
Ѕезразлично
11% (21)
Ќормально, сам бы спамил
6% (11)
ќтрицательно
67% (129)
ј „“ќ, ≈—“№ —ѕјћ ...
6% (11)

ѕроголосовало: 193
¬опрос в службу поддержки: „то делать если € довел мышку до кра€ коврика, а курсор не дошел до кра€ экрана?
–ейтинг: 1.7/10 (3)
ѕосмотреть все анекдоты