CGI este un standard de comunicare intre documentele Web si scripturile CGI pe care le scrieti. Un program CGI este doar un program care comunica intr-un mod oarecare cu documentele Web, prin documente Web intelegand orice fel de fisiere utilizate pe Web. Existenta acestui standard permite realizarea unor pagini Web mai dinamice si mai interactive decat s-ar realiza numai cu pagini HTML (chiar daca aceste pagini contin scripturi care folosesc DHTML).
Aplicatiile CGI pot fi scrise in orice limbaj care poate fi executat calculatorul care este server Web. Alegerea limbajului depinde de tipul aplicatiei. Perl, spre exemplu, este foarte bun pentru manipularea sirurilor si fisierelor, in timp ce C este bun pentru aplicatii mari si complexe. Perl si C sunt probabil cele mai utilizate limbaje pentru programarea CGI. Depinzand de tipul si destinatia aplicatiei, precum si de indemanarea programatorului (in diferitele limbaje), pentru aplicatiile CGI se pot folosi limbajele:
Aceste limbaje, precum si multe altele, pun la dispozitie programatorului mijloace de a indeplini, pe de o parte, cerintele cuprinse in specificatiile CGI, iar pe de alta usureaza atingerea performantelor maximale ale acestei interfete.
In functie de complexitate aplicatiile CGI se impart in:
1. Aplicatii simple de genul
contoare de vizitare (de tip text)
- programe care genereaza sursa HTML pentru lucruri simple precum scrierea datei
- orice script PERL (program C, C++) care are, spre exemplu, mai putin de 50 de linii
- sau orice program C de aceeasi complexitate
2. Aplicatii de complexitate medie cum ar fi:
- generarea dinamica a imaginilor
- generarea unor intregi pagini HTML
- realizarea animatiilor
3. Aplicatii complexe precum:
- comunicarea cu bazele de date
- generarea dinamica a mai multor pagini HTML
- motoare de cautare, etc.
Simplu! Toate datele relavante transmise serverului de catre browser, precum datele dintr-un formular (la care browserul adauga automat antetele specifice protocolului HTTP), sunt transmise de server catre scriptul CGI fie prin intermediul unor variable de mediu, fie pe calea fisierului standard de intrare <STDIN> (care este modul implicit prin care un program primeste date).
Atunci cand un browser apeleaza un script CGI de la server, serverul porneste programul CGI intr-un proces independent. Deoarece, la un moment dat, pe server acelasi script poate rula pentru mai multi utilizatori, serverul transmite fiecarui proces, in care este executat scriptul, toata informatia de care acesta are nevoie pentru a deservi clientul pentru care a fost lansat procesul. Cu alte cuvinte exista o corespondenta univoca client - proces de rulare a scriptului, astfel incat, chiar daca este executat acelasi script, fiecare client va fi deservit conform cererii sale particulare.
Deoarece serverul creeaza de fiecare data cate un nou mediu pentru fiecare proces in care este executat scriptul, calea cea mai simpla de transmitere a informatiei server - script se face prin intermediul variabilelor de mediu. Tabelul de mai jos listeaza variabilele de mediu ale CGI.
Variabila | Semnificatie |
---|---|
AUTH_TYPE |
Contine metoda de autentificare folosita pentru a accepta cererea browserului, daca este folosita vre una. Un exemplu de metoda de autentificare este schema utilizator/parola. |
CONTENT_LENGTH |
Lungimea continutului furnizat de utilizator in pagina Web care apeleaza scriptul CGI. Deoarece acest continut este transmis scriptului sub forma unui sir (de caractere), aceasta lungime este exprimata in octeti (bytes), cate un byte pentru fiecare caracter. |
CONTENT_TYPE |
Contine tipul fisierului (datei) care insoteste cererea browserului catre scriptul CGI. Spre exemplu: text/html,sau image/jpeg. |
GATEWAY_INTERFACE |
Contine versiunea CGI care va fi utilizata. Pentru versiunea 1.1 a specificatiei CGI, aceasta variabila va fi CGI/1.1. |
PATH_INFO |
Contine informatii suplimentare privind o cale (path) necesara scriptului CGI. Aceasta informatie este plasata dupa un slash la URL-ului care apeleaza scriptul CGI. este de regula o cale virtuala catre un alt document, relativ la radacina curenta a site-ului, pe care scriptul CGI sa il foloseasca. Aceasta valoare este precizata din informatia adaugata URL-ului care apeleaza scriptul CGI. |
PATH_TRANSLATED |
Contine calea completa catre PATH_INFO. |
QUERY_STRING |
Contine data furnizata de utilizator atunci cand metoda folosita este GET. Informatia transmisa sub forma de sir este adaugata dupa un semn de intrebare (?) la URL-ul de apelare. Spre exemplu, in URL-ul http://www.robertm.com/cgi-bin/answer.pl?state=CA, variabila QUERY_STRING contine "state=CA." |
REMOTE_ADDR |
Memoreaza adresa IP a masinii pe care ruleaza aplicatia browser care a apelat scriptul CGI. |
REMOTE_HOST |
Memoreaza numele domeniului caruia ii apartina masina pe care ruleaza aplicatia browser care a apelat scriptul CGI. Daca aceasta informatie nu ii este disponibila serverului numai REMOTE_ADDR va fi setata. |
REMOTE_IDENT |
Memoreaza numele de intrare al utilizatorului) (user's login name) numai daca serverul Web suporta identificare. |
REMOTE_USER |
Memoreaza numele utilizatorului specificat pentru autentificare. Acesta variabila este setata numai daca serverul suporta autentificare si scriptul CGI este protejat. |
REQUEST_METHOD |
Contine metoda folosita la apelarea scriptului CGI. Aceasta poate contina una dintre metodele de apelare valide pentru HTTP precum: GET, HEAD, POST, PUT si asa mai departe. |
SCRIPT_NAME |
Memoreaza calea virtuala si numele scriptului CGI care este executat. Aceasta este folosita drept URL pentru autoreferire. |
SERVER_NAME |
Contine fie numela, fie numele domeniului si adresa IP a masinii pe care ruleaza aplicatia de server Web. |
SERVER_PORT |
Contine numarul portului pe care browserul Web a trimis cererea catre server. |
SERVER_PROTOCOL |
Contine numele si versiunea protocolului utilizat pentru a face apelul scriptului CGI. In majoritatea cazurilor, acesta va fi ceva de genul "HTTP/1.0". |
SERVER_SOFTWARE |
Memoreaza numele si versiunea aplicatiei de server Web care executa scriptul CGI. |
HTTP_
. Tabelul urmator
listeaza aceste variabile.
HTTP Request Header | Meaning |
---|---|
HTTP_ACCEPT |
Contine lista de elemente separate prin virgula a tipurilor media pe care browserul le poate accepta in raspuns de la serverul Web. Exemple sunt audio/basic, image/gif, text/*, */*. Ultimele doua elemente contin (*) cu semnificatia de "orice" (wildcard), precizand ca sunt acceptate toate formele de text, iar */* specifica suportatre oricarui tip de continut. |
HTTP_ACCEPT_ENCODING |
Contine metodele de codificare pe care browserul le poate folosi la interpretarea raspunsului de la server. Exemple sunt: x-zip, x-stuffit si x-tar. |
HTTP_ACCEPT_LANGUAGE |
Contine limbajul preferat de browser pentru raspunsul de la server. Cu toate acestea, raspunsuri in orice limba nespecificata in aceste variabile sunt permise. Un exemplu este "en_UK", care se refera la engleza regatului unit (engleza vorbita in Anglia). |
HTTP_AUTHORIZATION |
Contine informatia privind autorizarea furnizata de browserul Web. VAloarea ei este utilizata de browser pentru a se autentifica pe el insusi catre server. Nu exista un singur format pentru toate posibilele valori ale acestui camp si noi formate pot fi adaugate. Un exemplu schema utilizator/parola in care valoarea este de forma "nume:parola". |
HTTP_CHARGE_TO |
Formatele acestui camp sunt inca nedeterminate. Totusi, este diponibil pentru a contine informatii referitoare la contul si costul pentru receptionarea informatiei solicitate. |
HTTP_FROM |
Contine numele utilizatorului furnizata de browserul WEB sub forma unei adrese de e-mail. Spre exemplu cineva@www.companie.com. |
HTTP_IF_MODIFIED_SINCE |
Poate contine o valoare specificata a datei intr-un format standard valid ARPANET, precum: Weekday, DD-Mon-YY HH:MM:SS TIMEZONE. Acest camp poate fi utilizat in conjunctie cu metoda GET pentru a solicita un document numai daca s-a schimbat de la data specificata. |
HTTP_PRAGMA |
Contine valoarea oricarei directive speciale pentru serverul Web. De exemplu, un server de proxy Web are o valoare valida "no-cache", care inseamna ca serverul proxy sa returneze documentul solicitat direct de la server si nu din copia lui din cache. In acest mod se evita obtinerea unui document expirat atunci cand intre browser si serve este interpus un server proxy Web. |
HTTP_REFERER |
Contne URI-ul (uniform resource identifier, care este un superset al URL-ului) documentului care contine link-ul catre documentul solicitat. Un xemplu ar fi: http://fpce4.fizica.unibuc.ro/indexmiddle.html. |
HTTP_USER_AGENT |
Contine numele aplicatiei browser Web care solicita
documentul. Un exemplu este: |
In mod evident sunt multe variabile
disponibile unui script CGI. Utilizarea unora sau altora se face in functie de
cerintele aplicatiei concrete. In tabelul urmator este listat un script PERL
pentru afisarea acestor variabile de mediu.
#!/usr/local/bin/perl print "Content-type:
text/html\n\n"; print "AUTH_TYPE =
$ENV{'AUTH_TYPE'}<BR>\n"; print "CONTENT_LENGTH =
$ENV{'CONTENT_LENGTH'}<BR>\n"; print "CONTENT_TYPE =
$ENV{'CONTENT_TYPE'}<BR>\n"; print "GATEWAY_INTERFACE =
$ENV{'GATEWAY_INTERFACE'}<BR>\n"; print "PATH_INFO =
$ENV{'PATH_INFO'}<BR>\n"; print "PATH_TRANSLATED =
$ENV{'PATH_TRANSLATED'}<BR>\n"; print "QUERY_STRING =
$ENV{'QUERY_STRING'}<BR>\n"; print "REMOTE_ADDR =
$ENV{'REMOTE_ADDR'}<BR>\n"; print "REMOTE_HOST =
$ENV{'REMOTE_HOST'}<BR>\n"; print "REMOTE_IDENT =
$ENV{'REMOTE_IDENT'}<BR>\n"; print "REMOTE_USER =
$ENV{'REMOTE_USER'}<BR>\n"; print "REQUEST_METHOD =
$ENV{'REQUEST_METHOD'}<BR>\n"; print "SCRIPT_NAME =
$ENV{'SCRIPT_NAME'}<BR>\n"; print "SERVER_NAME =
$ENV{'SERVER_NAME'}<BR>\n"; print "SERVER_PORT =
$ENV{'SERVER_PORT'}<BR>\n"; print "SERVER_PROTOCOL =
$ENV{'SERVER_PROTOCOL'}<BR>\n"; print "SERVER_SOFTWARE =
$ENV{'SERVER_SOFTWARE'}<BR>\n"; print "HTTP_ACCEPT =
$ENV{'HTTP_ACCEPT'}<BR>\n"; print "HTTP_ACCEPT_ENCODING
= $ENV{'HTTP_ACCEPT_ENCODING'}<BR>\n"; print
"HTTP_ACCEPT_LANGUAGE =
$ENV{'HTTP_ACCEPT_LANGUAGE'}<BR>\n"; print
"HTTP_AUTHORIZATION = $ENV{'HTTP_AUTHORIZATION'}<BR>\n";
print "HTTP_CHARGE_TO = $ENV{'HTTP_CHARGE_TO'}<BR>\n";
print "HTTP_FROM = $ENV{'HTTP_FROM'}<BR>\n"; print
"HTTP_IF_MODIFIED_SINCE =
$ENV{'HTTP_IF_MODIFIED_SINCE'}<BR>\n"; print
"HTTP_PRAGMA = $ENV{'HTTP_PRAGMA'}<BR>\n"; print
"HTTP_REFERER = $ENV{'HTTP_REFERER'}<BR>\n"; print
"HTTP_USER_AGENT = $ENV{'HTTP_USER_AGENT'}<BR>\n"; |
Apasa butonul de mai jos pentru a vedea variabilele
Un exemplu de program CGI scris in C care afiseaza variabile de mediu este aici.
© Cornel Mironel Niculae, 2003-2007
05-May-2008