Интернет: как работи. CGI технология - общ интерфейс на шлюза
CGI технология - общ интерфейс на шлюза
CGI - Общ интерфейс на шлюзае стандарт за интерфейс (комуникация) на външна приложна програма с информационен сървъртип HTTP, уеб сървър. Обикновено хипертекстовите документи, извлечени от WWW сървъри, съдържат статични данни. С CGI можете да създавате CGI програми, наречени шлюзове , които във взаимодействие с такива приложни системи като система за управление на бази данни, електронни таблици, бизнес графики и др., ще могат да показват динамична информация на екрана на потребителя.
Програмата за шлюз се стартира от WWW сървъра в реално време. WWW сървърът гарантира, че заявката на потребителя се предава на шлюза, а шлюзът от своя страна, използвайки инструменти на системата на приложението, връща резултата от обработката на заявката на екрана на потребителя. Програмата за шлюз може да бъде кодирана на C/C++, Fortran, Perl, TCL, Unix Schell, Visual Basic, Apple Script. Като изпълним модул, той се записва в поддиректория, наречена cgi-bin на WWW сървъра.
Предаване на данни към шлюзове
За да прехвърли данни за искане на информация от сървъра към шлюза, сървърът използва командния ред и променливите на средата. Тези променливи на средата се задават, докато сървърът изпълнява програмата на шлюза.
Заявки за различни методи
Информацията се предава на шлюзовете в следната форма:
име=стойност&име1=стойност1&..,
Където име - имепроменлива (от оператор ФОРМА, например), а стойността е неговата реална стойност. В зависимост от метода, който се използва за заявката, този низ се появява или като част от URL адреса (в случай на метода ВЗЕМЕТЕ), или като съдържание HTTPзаявка (метод ПУБЛИКУВАНЕ). В последния случай тази информация ще бъде изпратена до шлюза при стандартен вход.
CONTENT_LENGTH байтът се изпраща към дескриптора на стандартния входен файл. Сървърът също изпраща CONTENT_TYPE (тип данни, които се прехвърлят) към шлюза. Не се изисква сървърът да изпраща знака за край на файла след изпращане на CONTENT_LENGTH байта данни и след като шлюзът ги е прочел.
Пример
Нека вземем за пример резултата от стартиране на формуляр с метода POST (METHOD="POST"). Нека получим 7 байта, кодирани нещо подобно:
a=b&b=c.
В този случай сървърът ще зададе CONTENT_LENGTH на 7 и CONTENT_TYPE на application/x-www-form-urlencoded. Първият знак в стандартния вход на шлюза ще бъде "a", последван от останалата част от кодирания низ.
Аргументи на командния ред
Портал към командна линияполучава от сървъра:
- остатъкът от URL след името на шлюза като първи параметър (първият параметър ще бъде празен, ако присъства само името на шлюза) и
- списък с ключови думи като останалата част от командния ред за скрипта за търсене, или
- редуващи се имена на полета на формуляр с добавен знак за равенство (на четни позиции) и съответните стойности на променливи (на нечетни позиции).
Ключовите думи, имената на полетата на формуляра и стойностите се изпращат декодирани (от HTTP URL кодиращия формат) и повторно кодирани съгласно правилата за кодиране на Bourne shell, така че шлюзът на командния ред да получи информацията такава, каквато е, без да е необходимо да извършване на допълнителни преобразувания.
Заявки за извлечения от FORM
Изявленията FORM се обработват така, че всеки параметър на име на поле завършва със знак за равенство и остатъкът е стойността на този параметър. Ако има нещо след името на скрипта (шлюза), тази информация се предава като първи параметър. В противен случай първият параметър ще бъде празен.
Примери:
/htbin/foo/x/y/z?name1=value1&name2=value2 се извиква като: /.../foo /x/y/z name1= value1 name2= value2 и /htbin/foo?name1=value1&name2=value2 е наречен като: /.../foo "" име1= стойност1 име2= стойност2
CGI променливи на средата
Следните променливи на средата не са специфични за типа заявка и са зададени за всички заявки.
SERVER_SOFTWARE Името и версията на информационния сървър, който отговаря на заявката (и изпълнява шлюза). Формат: име/версия SERVER_NAME Името на хоста, на който работи сървърът, DNS име или IP адрес, както се появява в URL адреса. GATEWAY_INTERFACE Версията на CGI спецификацията по времето, когато сървърът е бил компилиран. Формат: CGI/версия
Следните променливи на средата са специфични за различни заявки и се попълват преди извикване на шлюза: SERVER_PROTOCOL Името и версията на информационния протокол, в който е дошла заявката. Формат: протокол/версия SERVER_PORT Номер на порт, до който е изпратена заявката REQUEST_METHOD Методът, който е използван за заявката. За HTTP това е ВЗЕМЕТЕ, ГЛАВА, ПУБЛИКУВАНЕи т.н. PATH_INFO Допълнителна информация за пътя, предоставена от клиента. С други думи, шлюзът може да бъде достъпен чрез виртуален път, последван от някои Допълнителна информация. Тази информация се предава на PATH_INFO. PATH_TRANSLATED Сървърът предава преведена версия на PATH_INFO, която включва пътя, преведен от виртуален във физически. SCRIPT_NAME Виртуалният път до шлюза, който трябва да бъде изпълнен, използван за получаване на URL. Следва информация за QUERY_STRING? в URL адреса, към който препраща този шлюз. Тази информация е низът на заявката. Не трябва да се декодира по никакъв начин. Независимо от командния ред, тази променлива винаги трябва да се задава, когато такава информация е налична. REMOTE_HOST Име на хоста, който прави заявката. Ако сървърът няма тази информация, той трябва да зададе REMOTE_ADDR и да остави това поле незададено. REMOTE_ADDR IP адрес на хоста, който прави заявката. AUTH_TYPE Ако сървърът поддържа потребителско удостоверяване и шлюзът е защитен, този специфичен за протокол метод за удостоверяване се използва за проверка на потребителя. REMOTE_USER Използва се в ситуации, подобни на предишния случай, за съхраняване на потребителското име. REMOTE_IDENT Ако HTTP сървърът поддържа потребителска идентификация съгласно RFC 931, тогава тази променлива ще съдържа потребителското име, получено от сървъра. CONTENT_TYPE За заявки, които съдържат допълнителна допълнителна информация, като HTTP POST и PUT, това съдържа типа данни на тази информация. CONTENT_LENGTH Дължина на данните, изпратени от клиента.
В допълнение към тях, ако заявката съдържа допълнителни полета на заглавката на заявката, те се поставят в променливи на средата с HTTP_ префикса, последван от името на заглавката. Всички знаци "-" в заглавието се променят на "_" долна черта. Сървърът може да изключи всички заглавки, които вече е обработил, като Authorization, Content-type и Content-length. Ако е необходимо, сървърът може да изключи всяко (или всички) допълнителни полета на заглавката, в случай че включването им би довело до превишаване на ограничението за размер на променливата на средата. Пример за такава променлива е променливата HTTP_ACCEPT, която е дефинирана в спецификацията CGI/1.0. Друг пример би бил заглавката User-Agent.
HTTP_ACCEPT Списък с MIME типове, които клиентът може да обработва, както е посочено в HTTP заглавките. Други протоколи трябва да получат тази информация от други места (ако им е необходима). Всеки тип в този списък трябва да бъде разделен със запетая според HTTP спецификацията. Формат: тип/подтип, тип/подтип HTTP_USER_AGENT Viewer, който клиентът използва, за да направи заявката. Общ формат: програма/версия библиотека/версия.
Извеждане на информация от шлюза
Основни понятия
Шлюзът извежда своя изход към стандартен изход. Този резултат може да бъде или документ, генериран от шлюза, или инструкции към сървъра къде да получи необходимия документ.
Обикновено шлюзът произвежда своя изход, който се интерпретира и изпраща обратно на клиента. Предимството на този подход е, че шлюзът не трябва да изпраща пълния HTTP/1.0 хедър при всяка заявка.
Изходящ хедър
За някои шлюзове може да е необходимо да се избегне обработката на изхода от сървъра и да се комуникира директно с клиента. За да разграничи такива шлюзове от другите, CGI изисква имената им да започват с префикса nph-. В този случай шлюзът е отговорен за връщането на синтактично правилен отговор на клиента.
Анализирани заглавки
Изходът на шлюза започва с малък хедър. Той съдържа текстови низове, в същия формат като HTTP заглавката и завършва с празен ред (съдържащ само символ за подаване на ред или CR/LF).
Всички заглавни редове, които не са сървърни директиви, се изпращат директно на клиента. В момента CGI спецификацията дефинира три сървърни директиви: Content-type Типът MIME на документа, който трябва да бъде върнат. Местоположение Това поле се използва, когато е необходимо да се посочи на сървъра, че не се връща самият документ, а връзка към него.
Ако аргументът е URL адрес, сървърът ще инструктира клиента да пренасочи заявката. Ако аргументът е виртуален път, сървърът ще върне документа, указан от този път, на клиента, сякаш клиентът го е поискал директно.
- Статус
Тази директива се използва за настройка на HTTP/1.0 сървъра на низ за състояние, който ще бъде изпратен на клиента. Формат: nnn xxxxx, където nnn е 3-цифрен код на състоянието, а xxxxx е низ за причина, като например „Забранено“.
Примери
Да приемем, че има някакъв конвертор на текст към HTML. Когато приключи работата си, трябва да произведе следния изход към стандартния изход:
Начало на изхода - Тип съдържание: текст/html - край на изхода - Сега помислете за шлюза, който в някои случаи трябва да изведе документа /path/doc.txt с на този сървър, сякаш е директно поискано от клиента чрез http://server:port/path/doc.txt. В този случай изходът на шлюза ще бъде: - начало на изхода - Местоположение: /path/doc.txt - край на изхода - И накрая, нека приемем, че шлюзът връща връзки към gopher сървъра, например gopher:// gopher.ncsa.uiuc.edu/ . Изходът на шлюза ще бъде както следва: - начало на изхода - Местоположение: gopher://gopher.ncsa.uiuc.edu/ - край на изхода - Неанализирани заглавки
Нека сега кажем, че имаме шлюз, който комуникира директно с клиента. Както беше отбелязано, името му трябва да започва с префикса nph- и трябва да връща валидна HTTP заглавка. В този случай, ако шлюзът е бил достъпен със стойност на SERVER_PROTOCOL, равна на HTTP/1.0, неговият изход трябва да отговаря на HTTP/1.0:
Начало на изхода - HTTP/1.0 200 OK Сървър: NCSA/1.0a6 Тип съдържание: текст/обикновен - край на изхода -
|
1) Главна информацияотносно CGI
От 1993 г. CGI е широко използвана технология за създаване на тристепенни клиент/сървър приложения в Интернет. CGI приложението, заедно с уеб сървъра, действа като сървър на приложения в трислойна архитектура клиент/сървър. CGI е набор от правила (спецификация), според които потребителските програми, стартирани на уеб сървър, могат да връщат данни на клиента под формата на HTML документ. CGI е конзолно приложение, което се зарежда в отговор на клиентска заявка за извличане или актуализиране на данни, изпълнява се като отделен процес с една нишка под контрола на уеб сървъра и се разтоварва веднага след завършване. WinCGI е реализация на CGI за Windows.
2) Варианти на изпълнение
Програма, изпълнявана от уеб сървър в съответствие със спецификацията на CGI, се нарича CGI скрипт. Може да бъде написан на всеки език за програмиране (C, Basic, Pascal и т.н.) или на команден език (shell, perl и т.н.), който позволява създаването на изпълними модули. CGI скриптът действа като посредник между уеб сървъра и други сървъри, като например сървър на база данни, и затова често се нарича шлюз. По подразбиране CGI програмите се намират в директорията C:\InetPub\Scripts|Cgi-bin, но можете да създадете своя собствена виртуална директория.
3) Методи за взаимодействие между CGI и WEB сървър
CGI спецификацията предоставя няколко начина за взаимодействие между CGI програма и уеб сървър, различаващи се по вида на обмен на данни между сървъра и програмата.
. Предаването на параметри в командния ред (например с помощта на манипулатора ISINDEX, поставен в секцията
. Предаване на стойности на променливи на средата (има повече от 17 от тях).
. Прехвърляне на данни чрез стандартен входен поток (STDIN, STDOUT).
Заявка от тип ISINDEX е заявка от формата: http://site.ru/somthig-cgi/cgi-script?word1+word2+word3
Основното тук е списъкът с думи след символа „?“. Думите са изброени чрез символа “+” и за кирилицата не са кодирани в шестнадесетични поредици. Последователността от думи след "?" ще бъде поставен в променливата на средата QUERY_STRING.
Заявка от тип FORM-URLENCODED е заявка от формата: http://site.ru/something-cgi/cgi-script?field=word1&field2=word2
Данните на формуляра се записват като двойки поле_име-стойност, разделени със знака „&“.
Променливи на средата, които не зависят от типа на заявката:
СЪРВЪРЕН_СОФТУЕР– показва името и версията на http сървъра във формат: име/версия.
ИМЕ НА СЪРВЪРА– показва Име на домейнсървър.
SERVER_ADDR– показва IP на сървъра.
SERVER_ADMIN– имейл на администратора на уеб сървъра.
GATEWAY_INTERFACE– CGI версия към момента на компилиране на httpd демона във формат: CGI/версия
DATE_GMT– текуща дата и час в часовата зона GMT.
DATE_LOCAL– текуща дата и час в часовата зона на сървъра.
DOCUMENT_ROOT– път към главната директория на уеб сървъра.
Променливи на средата, които зависят от типа на заявката:
SERVER_PROTOCOL– протокола, с който е постъпило искането.
SERVER_PORT– порта, на който е получена заявката.
REQUEST_METHOD– тип заявка: POST, GET и т.н.
REQUEST_URL– страницата, изпратила заявката.
SCRIPT_NAME– URL адрес на скрипт без име на сървър.
SCRIPT_FILENAME – пълно име на скрипт файла на диска.
QUERY_STRING– информация, съдържаща се в командния ред на извикването на скрипта (след? в URL).
ТИП СЪДЪРЖАНИЕ– MIME тип данни, предавани на скрипта.
CONTENE_LENGTH– дължина на предаваните данни.
Стандартен изходен поток:
Въвеждането на данни в скрипт чрез стандартния входен поток се извършва само при използване на метода POST за достъп до ресурса (скрипт). В този случай променливата на средата CONTENT_LENGTH е зададена на броя знаци, които трябва да бъдат прочетени от стандартния входен поток на скрипта, а променливата на средата CONTENT_TYPE е зададена на типа на кодиране на данните, които се четат от стандартния входен поток. Когато четете символ по знак в C, можете да използвате например следния кодов фрагмент:
int n;
char *buf;
n=atoi(getenv(*CONTENT_LENGTH*));
buf=(char *)malloc(n+1);
memset(buf, '\000',n+1);
за (i=0; iBR> (buf[i]=getchar())
…
безплатно (buf);
4) Методи за пренос на данни
a) Методът GET предава данни на програмата CGI чрез променливи на средата, които всъщност се добавят към URL чрез разделителния знак ?.
На първо място, за тези цели се използва променливата query_string - дълъг низ, състоящ се от двойки име = стойност, разделени една от друга със символа амперсанд - &. Получава се бързо, но обемът на прехвърлените данни не надвишава 256 × 1024 байта, в зависимост от вида на уеб сървъра.
b) Методът POST прехвърля данни чрез стандартния входен поток stdin (Ini файл за WinCGI). Данните всъщност се добавят към тялото на HTML заявката. Броят на прехвърлените байтове е посочен в променливата на средата content_length. Това е по-бавен начин за прехвърляне на данни, но количеството прехвърлени данни не е ограничено.
в) HREF параметър на етикет A
В допълнение към методите GET и POST