Метод POST

Очевидно, что в строку URL нельзя втиснуть бесконечное число символов. И браузер, и среда, в которой функционирует сервер, имеют ограничения либо, как в случае браузера, по длине поля location, либо по длине области переменных окружения. Правда, последнее для современных систем не очень актуально. Например, операционная система IRIX 6.2 позволяет размещать в области переменных окружения данные объемом до 4 Mбайт. Тем не менее, для передачи относительно больших объемов предпочтительнее использовать метод доступа POST:

<FORM METHOD=post ACTION=script.cgi>

<INPUT NAME=n1 VALUE="Поле1">

<INPUT NAME=n2 VALUE="Поле2">

<INPUT VALUE="Отправить">

</FORM>

В нашем примере в контейнере FORM появился атрибут METHOD, который принял значение POST. Результат работы скрипта не изменился, но сам скрипт претерпел существенные изменения. Теперь запрос принимается со стандартного ввода, а не из переменной окружения QUERY_STRING.

При методе POST данные передаются как тело HTTP-сообщения, и скрипт читает их со стандартного ввода. При этом есть один существенный нюанс, который ограничивает круг средств разработки скриптов для приема данных по POST. Он заключается в том, что сервер не закрывает канал передачи данных скрипту после передачи последнего символа запроса. В переменной CONTENT_LENGTH сервер сообщает, сколько данных со стандартного ввода нужно считать. Таким образом, язык программирования сценариев или универсальный язык программирования должны уметь читать определенное количество символов из стандартного ввода. Например, многие разновидности командных языков UNIX (Bourn-shell, Kernel-shell и т.п.) могут читать только строками и ждут закрытия входного потока.

Обычно при описании программирования CGI-скриптов рассматривают только методы GET и POST. В принципе, в форме можно указывать любые другие методы, например, PUT. Просто серверы не имеют стандартных модулей обработки этих методов, поэтому, кроме формы и скрипта, в случае нестандартного метода требуется произвести еще и соответствующую настройку сервера.

Кодирование

Существует два типа кодирования содержания (тела) HTTP-сообщения, которые можно определить в форме:

application/x-www-form-urlencoded

multipart/form-data

Все, что рассматривалось в данном разделе до сих пор, относилось к первому типу кодирования тела HTTP-сообщения. Первый тип кодирования выбирается по умолчанию и является основным способом. Единственное, что пока не было рассмотрено, так это то, что, собственно, представляет собой этот самый URLENCODED.

В URL документа можно использовать только символы набора Latin1. Это первая половина таблицы ASCII за вычетом первых 20 символов. Все остальные символы заменяются своими шестнадцатеричными эквивалентами. Кроме того, такие символы, как "+" или "&", играют роль разделителей или коннекторов. Если они встречаются в значении поля, то тоже заменяются на шестнадцатеричный эквивалент. Наиболее характерно это для работы с русским алфавитом. Поэтому скрипт, который принимает запросы, должен уметь эти символы декодировать.

Второй тип применяется для передачи двоичной информации в теле HTTP-сообщения. Если проводить аналогии с электронной почтой, то multipart/form-data обеспечивает присоединение файла данных (attachment) к HTTP-запросу. Наиболее типичным примером является передача файла с машины пользователя на сервер:

<FORM ACTION=script.cgi METHOD=post

ENCTYPE=multipart/form-data>

<INPUT NAME=n1 VALUE="Поле1">

<INPUT NAME=n2 TYPE=file>

<INPUT VALUE="Отправить">

</FORM>

В данном случае HTTP-сообщение будет очень похоже на почтовое сообщение в стандарте MIME (собственно, это и есть MIME-сообщение, только передается оно по протоколу HTTP). Естественно, что для приема такого сообщения нужен скрипт, который бы смог разобрать его на части, а потом декодировать необходимую информацию.

35. Настройка Web-сервера для поддержки технологий CGI и SSI.

Для исполнения 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 (первый параметр директивы), которому ставится в соответствие реальный путь в каталоге файловой системы вычислительной установки, где эксплуатируется сервер (второй аргумент). Например:

https://server.pub.niiar.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-скриптов.

36. Технология SSI. Основные директивы SSI.

Server Side Includes

SSI представляет собой механизм разбора HTML-документов на стороне сервера с целью обнаружения в документе и выполнения директив, добавляющих в документ дополнительную информацию.

Все директивы вставляются внутрь тэгов HTML-комментариев, что позволяет клиенту, в случае, если сервер не поддерживает SSI, игнорировать эти директивы. Директивы имеют следующий формат:

<!--#директива параметр(ы)="значение"-->

Ниже следует список основных директив SSI и их параметров.

echo

Подставляет в документ значение указанной в качестве параметра переменной окружения (см. также список CGI-переменных) или специальной переменной SSI (см. ниже):

<H1>Вы пришли на сервер, находящийся по адресу

<!--#echo var="SERVER_NAME"-->...</H1>

include

Вставляет в документ текст другого файла. Параметры: file - указывает путь к вставляемому файлу относительно расположения данного документа; virtual - указывает виртуальный путь (как он указывался бы в URL) к вставляемому файлу.

<!--#include file="stuff.html"-->

<!--#include virtual="/personal/stuff.html"-->

Эта директива очень удобна для создания стандартных шапок и подвалов веб-страниц.

fsize

Вставляет размер указанного в параметре файла (путь к файлу виртуальный):

Размер файла archive.zip -

<!--#fsize file="/archive.zip"--> bytes.

flastmod

Вставляет в документ дату и время последней модификации указанного в параметре файла (путь к файлу виртуальный):

Дата последнего изменения:

<!--#flastmod file="/this_dir/this_file.html"-->bytes.

Формат вывода даты и времени может быть специфицирован параметром timefmt директивы config.

exec

Выполняет внешнюю программу, указанную параметром, и вставляет вывод этой программы в документ. Параметры: cmd - выполняемая программа является неким обычным приложением; cgi - выполняемая программа является CGI-скриптом

<!--#exec cmd="/bin/finger $REMOTE_USER@$REMOTE_HOST"-->

На эту страницу заходили

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

раз.

В первом примере используется подстановка значений переменных окружения (см. CGI-переменные).

config

Модифицирует различные аспекты работы SSI. Параметры:

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

<!--#config errmsg="Файл не найден"-->

sizefmt - устанавливает формат вывода размера файла (подставляемого директивой fsize; значения: bytes - выводит в байтах; abbrev - округляет до целого числа килобайт.

<!--#config sizefmt="abbrev"-->

Размер файла archive.zip - примерно

<!--#fsize file="/archive.zip"--> bytes.

timefmt - устанавливает формат вывода даты и времени, подробнее см. здесь.

Специальные переменные SSI

Ниже приведены переменные SSI, которые можно использовать в директиве echo в дополнение к переменным CGI.

DOCUMENT_NAME

Имя данного документа. Например:

Вы читаете файл под названием:

<!--#echo var="DOCUMENT_NAME"-->

DOCUMENT_URL

Виртуальный путь к данному документу. Например:

Ссылка на этот документ:

<!--#echo var="DOCUMENT_URL"-->

QUERY_STRING_UNESCAPED

Декодированные данные из QUERY_STRING (см "Структура URL и кодирование данных запроса"), при этом все метасимволы шелла экранированы обратным слэшем (\).

DATE_LOCAL

Текущие дата и время по местному времени. Например:

Сейчас <!--#echo var="DATE_LOCAL"-->

DATE_GMT

Текущие дата и время по Гринвичу.

LAST_MODIFIED

Дата и время последней модификации данного документа. Например:

Этот файл был последний раз изменен

<!--#echo var="LAST_MODIFIED"-->


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: