Передача информации CGI-программе
К сожалению, эта информацдагявдяется статической. Форма же позволяет менять данные.
Строка запроса – не единственный способ передачи данных через URL. Другим способом является дополнительная информация о пути (extra path information), представляющая собой часть URL, расположенную после имени CGt-программы. Сервер выделяет эту часть и сохраняет ее в переменной среды PATH_INFO. CGI-программа может затем использовать эту переменную для извлечения данных. Например, URL:
http://www.domain/cgi-bin/registrar.cgi/4>regname = bobspasswordl = rumataspassword2 = r\amata&age = lt20&language = 4>russian&format = HTML&wish = %F6%C5%CC%Dl%DA%CE%D9
…содержит уже знакомые нам данные, но не в виде строки запроса, а в виде дополнительной информации о пути. При получении запроса с таким URL сервер сохранит данные в переменной среды:
PATH_INFO = /regname = bobspasswordl = rumataspassword2 = rumata&age = blt20&language = russian&format = HTML&wish = %F6%C5%CC%Dl%DA%CE%D9"
Название объясняется тем, что обычно этим способом передается информация о местоположении какого-либо файла (extra path information). Например, URL http://www.domain/cgi-bin/registrar.cgi/texts/jdk_doc.txt содержит дополнительную информацию PATH_iNFO=/texts/jdk_doc.txt" о местонахождении файла jdk_doc.txt относительно корневого каталога дерева документов. Другая переменная среды PATHJTRANSLATED содержит информацию об абсолютном местоположении файла в файловой системе, например:
PATH_TRANSLATED="/hcme/httpd/docs/texts/jdk_doc.txt"
…а переменная DOCUMENT_ROOT содержит путь к корневому каталогу дерева документов, В нашем случае DOCUMENT_ROOT="/home/httpd/docs/".
При использовании метода POST данные формы пересылаются серверу в теле запроса. Если в примере 15.1 вместо метода GET использовать метод POST:
<form method="post" action="/cgi-bin/registrar.cgi">,
…то запрос клиента будет иметь следующий вид:
POST /cgi-bin/registrar.cgi HTTP/1.1
(заголовки запроса, сообщающие серверу информацию о клиенте)
Content-length: 126 regname=bob&passwordl=rumata&password2=ruinata&age=lt20&language=russian& 4>format=HTML&wish=%F6%C5%CC%Dl%DA%CE%D9
В этом фрагменте среди прочих заголовков выделен заголовок content-length, сообщающий серверу количество байт, переданных в теле запроса. Это значение сервер присваивает переменной среды CONTENT_LENGTH, а данные посылает в стандартный ввод CGI-программы.
Методы GET и POST имеют свои достоинства и недостатки. Метод GET обеспечивает лучшую производительность при пересылке форм, состоящих из небольшого набора коротких полей. При пересылке большого объема данных следует использовать метод POST, так как браузер или сервер могут накладывать ограничения на размер данных, передаваемых в составе URL, и отбрасывать часть данных, выходящую за границу. Метод POST, к тому же, является более надежным при пересылке конфиденциальной информации.