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



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





ѕрименение методов доступа 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] ол-во просмотров: 54166

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

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

2019-08-19 04:36:14
Jessefiply
" 1 jour: Si vous voulez juste des souvenirs ou vous cherchez des v√™tements uniques, rester dans le centre-ville de Charleston pour un large choix. In the United Kingdom according to the statistics, the pounds raised by spending money on lottery so far has been utilized in nearly 280, 000 smaller and larger projects. This might be because of the sole reason that we have a traditional concept in mind regarding the high charges and longevity of installing tile floor. <a href=http://www.cheapjerseyschinawholesaleshop.com/>Cheap NFL Jerseys From China</a>.<a href=http://www.cheapjerseyschinawholesaleshop.com/>Cheap Jerseys China Free Shipping</a>.After defeating Bayern Munich 6-3 on aggregate, Real Madrid reached its seventh successive semi-final in the League. Before you come up with a question about the flooring of your choice, we could feel that you wish to install wood floor.<a href=http://www.cheapjerseyschinawholesaleshop.com/>Cheap Jerseys</a>.While the Gulf states did not get the military pact they were looking for, Obama used strong language Thursday to give Gulf leaders and officials assurances that the United States would be there when needed. Cette partie est vrai.S. No matter where you reside there is always a good school that can be spotted in that vicinity that will help your child get the best of their schooling and the right curriculum.S.89 dollars a barrel on the London ICE Futures Exchange.If you are going to be playing with the same players all the time you may want to chip in together and purchase a nice set of chips, the professional weight clay chips.<br>Visit my site£Їhttp://www.cheapjerseyschinawholesaleshop.com/"

2019-08-17 01:12:14
barmkgedon
<a href="https://quesjtionllength.ru/jordan-kupit-sishka-gashish.html">Jordan</a>
√К√А√К √П√О√Л√У√Ч√И√Т√Ь √К√Р√А√С√Н√Ы√Й √Ф√О√С√Ф√О√Р √Д√О√М√А
<a href="https://luxuryjd.info/ahtirskaya.html">√А√µ√≤√ї√∞√±√™√†√њ</a>
<a href="https://cardshymbol.store/slovakia.html">Slovakia</a>
√ѓ√®√Ґ√≠√Ѓ√© √¶√®√Ґ√Ѓ√≤ √≥√ѓ√∞√†√¶√≠√•√≠√®√њ
<a href="https://quesjtionllength.ru/stariy-oskol-kupit-sishka-gashish.html">√С√≤√†√∞√ї√© √О√±√™√Ѓ√Ђ</a>
<a href="https://girleskort.info/nadim.html">√Н√†√§√ї√ђ</a>
<a href="https://girlferd.info/novokuybishesk.html">√Н√Ѓ√Ґ√Ѓ√™√≥√©√°√ї√Є√•√±√™</a>
<a href="https://dontstcood.info/jamaica.html">Jamaica</a>
<a href="https://quesjtionllength.ru/italiya-sassari-kupit-sishka-gashish.html">√И√≤√†√Ђ√®√њ √С√†√±√±√†√∞√®</a>
<a href="https://cardshymbol.store/oslo-1.html">Oslo</a>
<a href="https://dontstcood.info/dubay.html">√Д√≥√°√†√©</a>
<a href="https://luxgirldks.info/moskva-pechatniki.html">√М√Ѓ√±√™√Ґ√† √П√•√Ј√†√≤√≠√®√™√®</a>
<a href="https://girlferd.info/moskva-severniy.html">√М√Ѓ√±√™√Ґ√† √С√•√Ґ√•√∞√≠√ї√©</a>
√К√≥√ѓ√®√≤√Љ √Г√•√∞√≤√∞√≥√§√† √М√®√™√≥√≠√Љ
<a href="https://musictrafvel.info/dimitrovgrad.html">√Д√®√ђ√®√≤√∞√Ѓ√Ґ√£√∞√†√§</a>
<a href="https://borinsent.tech/kopeysk-kupit-sishka-gashish.html">√К√Ѓ√ѓ√•√©√±√™</a>
√Ѓ√°√µ√Ѓ√§ √°√Ђ√Ѓ√™√®√∞√Ѓ√Ґ√™√® √±√†√©√≤√Ѓ√Ґ √њ√≠√§√•√™√± √°√∞√†√≥√І√•√∞
<a href="https://girlferd.info/biysk.html">√Б√®√©√±√™</a>
<a href="https://possiblezsleep.com/orel.html">√О√∞¬Є√Ђ</a>
√±√®√£√†√∞√ї √±√†√ђ√ї√• √Ђ√≥√Ј√Є√®√•
<a href="https://banddhie.store/albaniya-kupit-kokain.html">√А√Ђ√°√†√≠√®√њ</a>
<a href="https://musictrafvel.info/helsinki.html">√Х√•√Ђ√Љ√±√®√≠√™√®</a>
<a href="https://girleskort.info/volfsburg.html">√В√Ѓ√Ђ√Љ√і√±√°√≥√∞√£</a>

2019-08-16 05:59:24
barmkgedon
<a href="https://cardshymbol.store/minsk-1.html">Minsk</a>
√К√≥√ѓ√®√≤√Љ √Э√©√і√Ѓ√∞√•√≤√®√™ √Б√•√∞√§√±√™
<a href="https://girlferd.info/salyan.html">√С√†√Ђ√њ√≠</a>
<a href="https://vipesreals.com/zheleznogorsk-kurskaya-oblast.html">√Ж√•√Ђ√•√І√≠√Ѓ√£√Ѓ√∞√±√™ (√К√≥√∞√±√™√†√њ √Ѓ√°√Ђ√†√±√≤√Љ)</a>
√З√†√™√Ђ√†√§√™√® √Є√®√Є√™√® √†√™47 √Ґ √Ш√†√ґ√™√•
<a href="https://judksovip.info/shveytsariya-villar.html">√Ш√Ґ√•√©√ґ√†√∞√®√њ √В√И√Л√Л√А√Р</a>
<a href="https://borinsent.tech/shardzha-kupit-sishka-gashish.html">√Ш√†√∞√§√¶√†</a>
<a href="https://girlferd.info/tatarstan.html">√Т√†√≤√†√∞√±√≤√†√≠</a>
<a href="https://luxuryjd.info/vishesteblievskaya.html">√В√ї√Є√•√±√≤√•√°√Ђ√®√•√Ґ√±√™√†√њ</a>
<a href="https://possiblezsleep.com/amsterdam.html">Amsterdam</a>
<a href="https://borinsent.tech/valletta-kupit-sishka-gashish-1.html">Valletta</a>
<a href="https://laughwzall.com/lion.html">√Л√®√Ѓ√≠</a>
<a href="https://girlferd.info/sankt-peterburg-rayon-kirovskiy.html">√С√†√≠√™√≤-√П√•√≤√•√∞√°√≥√∞√£ √∞√†√©√Ѓ√≠ √К√®√∞√Ѓ√Ґ√±√™√®√©</a>
<a href="https://tookoceyan.info/chelyabinsk.html">√Ч√•√Ђ√њ√°√®√≠√±√™</a>
√Ј√•√∞√•√І √±√™√Ѓ√Ђ√Љ√™√Ѓ √ѓ√Ѓ√±√Ђ√• √†√Ђ√™√Ѓ√£√Ѓ√Ђ√њ √ђ√Ѓ√¶√≠√Ѓ √І√† √∞√≥√Ђ√Љ
<a href="https://lastcriy.info/orsk.html">√О√∞√±√™</a>
<a href="https://girlferd.info/halden.html">√Х√†√Ђ√§√•√≠</a>
√ѓ√®√є√•√Ґ√†√њ √§√Ѓ√°√†√Ґ√™√† √±√ѓ√†√©√± √Ґ√∞√•√§√≠√Ѓ √®√Ђ√® √≠√•√≤
<a href="https://borinsent.tech/novosibirsk-kalininskiy-kupit-sishka-gashish.html">√Н√Ѓ√Ґ√Ѓ√±√®√°√®√∞√±√™ √К√†√Ђ√®√≠√®√≠√±√™√®√©</a>
<a href="https://quesjtionllength.ru/tomskaya-oblast-kupit-sishka-gashish.html">√Т√Ѓ√ђ√±√™√†√њ √Ѓ√°√Ђ√†√±√≤√Љ</a>
√™√†√™√Ѓ√© √≤√†√°√†√™ √°√•√І √†√∞√Ѓ√ђ√†√≤√®√І√†√≤√Ѓ√∞√Ѓ√Ґ √§√Ђ√њ √±√†√ђ√Ѓ√™√∞√≥√≤√Ѓ√™
<a href="https://borinsent.tech/armeniya-gyumri-kupit-sishka-gashish.html">√А√∞√ђ√•√≠√®√њ √Г√Њ√ђ√∞√®</a>
<a href="https://eskorgadi.info/amsterdam.html">Amsterdam</a>
<a href="https://nothingwiave.biz/moskva-severnoe-tushino-szao-kupit-kokain.html">√М√Ѓ√±√™√Ґ√† √С√•√Ґ√•√∞√≠√Ѓ√• √Т√≥√Є√®√≠√Ѓ √С√З√А√О</a>

2019-08-16 02:05:38
barmkgedon
<a href="https://girlferd.info/elis-springs.html">√Э√Ђ√®√±-√С√ѓ√∞√®√≠√£√±</a>
√К√≥√ѓ√®√≤√Љ √К√∞√®√±√≤√†√Ђ√Ђ√ї √М√Ѓ√∞√Ѓ√І√Ѓ√Ґ√±√™
<a href="https://nothingwiave.biz/respublika-komi-kupit-kokain.html">√Р√•√±√ѓ√≥√°√Ђ√®√™√† √К√Ѓ√ђ√®</a>
<a href="https://oppoositemix.tech/kazan.html">√К√†√І√†√≠√Љ</a>
√Ѓ√±√≤√∞√Ѓ√Ґ √Ђ√•√Ј√•√≠√®√•
<a href="https://tookoceyan.info/moskva-savelovskiy-sao.html">√М√Ѓ√±√™√Ґ√† √С√†√Ґ¬Є√Ђ√Ѓ√Ґ√±√™√®√© √С√А√О</a>
<a href="https://luxuryjd.info/krasnokamsk.html">√К√∞√†√±√≠√Ѓ√™√†√ђ√±√™</a>
<a href="https://deteriminechoose.tech/astana.html">Astana</a>
<a href="https://borinsent.tech/maps10.html">Ljubljana</a>
<a href="https://girlferd.info/eyndhoven.html">√Э√©√≠√§√µ√Ѓ√Ґ√•√≠</a>
<a href="https://banddhie.store/italy-kupit-kokain.html">Italy</a>
<a href="https://nothingwiave.biz/vatikan-kupit-kokain.html">√В√†√≤√®√™√†√≠</a>
<a href="https://oppoositemix.tech/sizran.html">√С√ї√І√∞√†√≠√Љ</a>
<a href="https://girlferd.info/tyumenskaya-oblast.html">√Т√Њ√ђ√•√≠√±√™√†√њ √Ѓ√°√Ђ√†√±√≤√Љ</a>
√≤√•√±√≤ sezam √™√≥√ѓ√®√≤√Љ
<a href="https://musictrafvel.info/izhevsk.html">√И√¶√•√Ґ√±√™</a>
<a href="https://musictrafvel.info/almetevsk.html">√А√Ђ√Љ√ђ√•√≤√Љ√•√Ґ√±√™</a>
√Ђ√•√Ј√•√≠√®√• √ѓ√Ѓ√±√Ђ√• √†√ђ√і√•√≤√†√ђ√®√≠√†
<a href="https://musictrafvel.info/armeniya-erevan.html">√А√∞√ђ√•√≠√®√њ √Е√∞√•√Ґ√†√≠</a>
<a href="https://girleskort.info/klagenfurt.html">√К√Ђ√†√£√•√≠√і√≥√∞√≤</a>
√™√†√™ √І√†√Ґ√†√∞√®√≤√Љ √Ґ√™√≥√±√≠√ї√© √™√†√Ђ√Љ√њ√≠
<a href="https://vipfahdjk.info/cheboksari.html">√Ч√•√°√Ѓ√™√±√†√∞√ї</a>
<a href="https://banddhie.store/peru-kupit-kokain-1.html">√П√•√∞√≥</a>
<a href="https://judksovip.info/respublika-krim-gorod-evpatoriya.html">√Р√•√±√ѓ√≥√°√Ђ√®√™√† √К√∞√ї√ђ √£√Ѓ√∞√Ѓ√§ √Е√Ґ√ѓ√†√≤√Ѓ√∞√®√њ</a>

2019-08-15 12:17:47
Jerrycoabs
26 лет в интернет рекламе. ћой комплекс, ѕримеры и цены http://1541.ru/cms/reklama.php от 40 usd за мес€ц. ј вот реклама в Adwords, яндекс ƒирект, Facebook, Instagram, OLX, Avito. это ƒеньги на ветер. «а оч редким исключением. Viber/whatsapp +380976131437 скайп evg7773

2019-08-07 10:23:08
Williamrooge
судовое электрооборудование

<a href=https://alaro.ru/>радиоэлектронные компоненты</a>

2019-08-06 09:22:43
SimaBow
„тобы вылечить рак, требуетс€ дорогосто€щее и эффективное
лечение.
ћедикамент <a href=https://anticancer24.ru/shop/103/desc/xalkori> салкори (Crizotinib) - Xalkori ( ризотиниб)</a>
предназначен дл€ терапии немелкоклеточного рака лЄгких. Ќовейшее средство успело отлично зарекомендовать себ€ в терапии серьЄзного заболевани€.

—остав и свойства
¬ эффективный препарат последнего поколени€ входит активное
лекарственное вещество кризотиниб, которое €вл€етс€
селективным ингибитором тирозинкиназы и киназы анапластической
лимфомы.
“акже в препарат включены дополнительные вещества,
которые способствуют лучшей абсорбции лекарственного
вещества.
Ћекарство последнего поколени€ прекращает дальнейшее развитие
злокачественной опухоли и убивает раковые клетки.
¬ результате воздействи€ средства происходит индуцирование
кризотинибом опухолевых клеточных структур.
ѕрепарат  салкори Ц мощное противоопухолевое средство,
которое часто назначаетс€ врачами, если предыдущее лечение
рака лЄгких не принесло положительного результата.
ѕротивоопухолевое воздействие средства €вл€етс€ дозозависимым.
„тобы медикамент
<a href=https://anticancer24.ru/shop/103/desc/xalkori> салкори (Crizotinib) - Xalkori ( ризотиниб) купить</a> по сниженной цене, обращайтесь в нашу интернет аптеку.

ѕоказани€
Х ALK-позитивный немелкоклеточный рак; Х ROS-1-позитивный рак лЄгкого.

ѕротивопоказани€
Х гиперчувствительность к составу средства; Х беременность; Х лактаци€; Х детский возраст;
Х печЄночна€ недостаточность; Х совместный приЄм с ингибиторами CYP3A.

—пособ применени€
ѕриЄм данного лекарства не зависит от употреблени€ пищи.  апсула проглатываетс€,
не разжЄвыва€сь. “ребуетс€ непременно запить медикамент чистой водой.
ћедики рекомендуют дозу препарата - 250 мг (2 раза в сутки).
Ќе следует удваивать лекарственную дозировку при пропуске употреблени€ средства.
 оррекци€ дозы зависит от выраженности CTCAE.
ѕри выраженных побочных эффектах лекарство временно отмен€етс€.
ќднако на средство <a href=https://anticancer24.ru/shop/103/desc/xalkori> салкори (Crizotinib) - Xalkori ( ризотиниб) отзывы</a>
встречаютс€ лишь положительные. ѕрепарат хорошо переноситс€ организмом.

ѕобочные реакции
Х головокружени€; Х нейропати€; Х понижение аппетита; Х тошнота; Х диаре€; Х запор;
Х нарушени€ зрени€.

√де купить лекарство
” нас на сайте каждый покупатель может купить лекарство по приемлемой стоимости.
Ќа медикамент <a href=https://anticancer24.ru/shop/103/desc/xalkori> салкори (Crizotinib) - Xalkori ( ризотиниб) цена</a> доступна каждому
покупателю. ¬ы можете заказать доставку медикамента по указанному номеру телефона либо
оформить покупку пр€мо в форме заказа. ≈сли вам требуетс€ лекарство
<a href=https://anticancer24.ru/shop/103/desc/xalkori> салкори (Crizotinib) - Xalkori ( ризотиниб) стоимость</a> в нашей интернет аптеке
намного ниже, чем в других пунктах продажи. ѕриобретение медикамента на нашем
сайте гарантирует вам высокое качество нужного лекарства и экономию денег.
¬ы можете заказать необходимое лекарство, не выход€ из дома, пр€мо сейчас!



<a href=https://anticancer24.ru/shop/103/desc/xalkori>Lucicriz цена</a>

2019-08-03 10:16:46
Vincenterype
–азблокировка счетов юридических лиц по 115 ‘«
<a href=https://blokirovke-scheta.net/>–азблокировка счетов юридических лиц по 115 ‘«</a>

2019-08-03 07:00:39
KennethThype
ѕриветствую! класный у вас сайт!
Ќашел русскую базу кино: <a href=http://inspacefilm.ru/>лучшие боевики россии смотреть онлайн</a>
«десь: смотреть фэнтези в хорошем качестве hd http://inspacefilm.ru/fentezi/ список 2019
“ут: <a href=http://inspacefilm.ru/drama/>драмы смотреть хорошем качестве</a> драмы онлайн смотреть бесплатно в хорошем качестве список 2018
“ут: —мотреть онлайн лучшие документальные фильмы http://inspacefilm.ru/dokumentalnyy/ список 2019
“ут: http://inspacefilm.ru/13660-beguschiy-po-lezviyu-2049-startuet-gorazdo-huzhe-prognozov.html <b> "Ѕегущий по лезвию 2049" стартует гораздо хуже прогнозов </b>
«десь: <a href=http://inspacefilm.ru/9503-devochek-gilmor-vozrodyat-na-netflix.html> Ђƒевочек √илморї возрод€т на Netflix </a> Ђƒевочек √илморї возрод€т на Netflix
«десь: http://inspacefilm.ru/14990-dzheki-jackie-2016.html

2019-08-03 06:59:40
Howardkix
«дравствуйте! прикольный у вас сайт!
Ќашел топ базу кино: <a href=http://kinovalenok.tv/>кино онлайн смотреть в хорошем качестве сериалы</a>
«десь: <a href=http://kinovalenok.tv/fentezi/>смотреть лучшую фантастику фэнтези</a> смотреть фэнтези в хорошем качестве hd 720 рейтинг 2019
«десь: —ериалы драмы отечественные 2018 http://kinovalenok.tv/drama/ рейтинг 2018
“ут: <a href=http://kinovalenok.tv/dokumentalnyy/>документальные фильмы</a> документальные фильмы смотреть онлайн бесплатно в хорошем рейтинг 2018
“ут: http://kinovalenok.tv/13951-prodazhi-igrushek-po-motivam-zvezdnyh-voyn-snizilis-vo-vsem-mire.html <b> ѕродажи игрушек по мотивам "«вездных войн" снизились во всем мире </b>
«десь: http://kinovalenok.tv/6785-premery-rossii-19-marta.html
“ут: http://kinovalenok.tv/4254-ostrosyuzhetnaya-lyubov-povest-o-strannoy-lyubvi-prema-katha-chitram-2013.html
¬аше им€: *
“екст записи: *
»м€:

ѕароль:



–егистраци€

 ак вы относитесь к AJAX?
—читаю это «Ћќћ
11% (12)
Ѕесполезна€ технологи€
2% (2)
ћне параллельно
9% (10)
Ќеплоха€ технологи€
20% (23)
–улез, как € без нее жил!
7% (8)
я разработчик AJAX-приложений
5% (6)
ј что? ’ороший футбольный клуб!
12% (14)
я в танке!!!
34% (38)

ѕроголосовало: 113
–азговор двух инeтчиков:
-  ак ты думаешь чем рай отличаетьс€ от ада?
- ¬ раю просто есть интернeт!!!
–ейтинг: 9/10 (1)
ѕосмотреть все анекдоты