V predoslych castiach VPW sme si ukazali, ako vytvorit stranku pomocou prikazu HTML. Zaoberali sme sa stylmi a moznostami textu, obrazkami, tabulkami a oknami. V casti Formulare sme sa vsak priblizili k teme CGI programov. Tato cast je venovana iba im.
CGI - Common Gateway Interface
CGI je rozhranie, pomocou ktoreho mozete prepojit WWW stranku s aplikaciou. Znamena to, ze vystup CGI programu sa da zobrazit v prehliadaci. CGI programy sa vykonavaju na strane servera, preto nijakym sposobom nezatazuju prehliadac.
Aby ste mali lepsiu predstavu o tom, na co mozno pouzit CGI, prezradim vam, ze pomocou tohto rozhrania su robene pocitadla pristupov, statistiky a formulare.
Co su to CGI programy?
CGI programy su programy ako kazde ine, maju vsak tu specificku vlastnost, ze sa spustaju z webovskej stranky. Jedine, cim sa odlisuju od beznych programov, su vstupne udaje, ktore sa vacsinou ziskavaju z formularov a vystupne udaje, ktore sa zobrazuju ako WWW stranka.
CGI programy sa velmi casto vytvaraju pomocou skriptovych jazykov (Perl, sh, tcl, ...) a preto sa casto oznacuju aj ako CGI skripty. Aplikacne rozhranie vsak umoznuje spustat aj kompilovane (spustitelne, binarne) subory (napr. binarka programu v jazyku C, C++, ...). Konkretna pouzitelnost niektoreho skriptoveho jazyka zavisi od WWW-servera.
Ako sa spustaju CGI programy
CGI programy spustate tak, ze nechate zobrazit ich URL, presne ako kazdy iny
dokument. Napr. <A
HREF="http://fornax.sk/cgi-bin/pokus/skript.pl">skript</A>
spusti
skript "skript.pl" a zobrazi jeho vystup v prehliadaci.
Ak chcete skript spustit s parametrami, mozete to urobit tak, ze ich
pripojite k URL (oddeluju sa znakom "&"):
<A
HREF="http://fornax.sk/cgi-bin/pokus/skript.pl?parameter1=hodnota1¶meter2=hodnota2">skript</A>
Pravdepodobne vsak vyuzijete skor formulare, pomocou ktorych ziskate vstupne argumenty pre CGI program.
Vytvaranie CGI programov
CGI programy sa vykonavaju na strane servera s pravami pouzivatela, pod
ktorym bezi WWW-server. V zasade su umiestnene v specialnom podadresari
(najcastejsie cgi-bin
). Obsah tohto adresara sa z webu neda
vypisat, ale iba spustit. Okrem toho si treba uvedomit, ze pravo zapisu do
tohto adresara ma vo vacsine pripadov iba webmaster. V pripade, ze chcete
vytvarat CGI programy, musite sa teda dohodnut s nim alebo spravcom systemu.
(Je vyhodne byt webmastrom ;-)
CGI programy sa teda musia nachadzat vo vopred urcenom adresari. (Ked si uvedomite, ze kazdy CGI program je potencialne nebezpecny, pochopite, preco ich nemoze vytvarat hocikto.)
Zakladna struktura CGI programu
CGI program musi v zasade urobit toto:
Content-type: MIME typ\n\n
Hlavicka s MIME-typom
Kazdy CGI program musi skor, nez zacne cokolvek vypisovat, oznamit WWW-serveru, aky format udajov ma predpokladat. Hlavicka je potrebna pre samotny prenos "vasho vypisu" pomocou http protokolu. Preto na zaciatku (pred prvym vypisom) vasho programu vypiste na standardny vystup text:
Content-type: MIME-typ\n\n
Konkretny priklad - ak vas program bude vypisovat HTML prikazy:
Content-type: text/html\n\n
Iny priklad - ak vas program bude vypisovat iba cisty text:
Content-type: text/plain\n\n
V pripade, ze chcete vypisat napr. subor typu GIF, bude to:
Content-type: image/gif\n\n
Dolezite: ak vas CGI program sposobi zobrazenie "Internal server error" a/alebo v chybovom logu najdete zaznam "Malformed header", znamena to, ze nevypisujete spravnu hlavicku! Nezabudnite na dva znaky konca riadku (\n)! Su velmi dolezite.
Vstupne argumenty:
CGI program moze nacitat vstupne argumenty tromi sposobmi:
char *argv[]
v C alebo
@ARGV
v Perle), ak CGI program spustite priamo s tymito
parametrami (pripojenymi za "?" v URL)
QUERY_STRING
(ak pouzijete
udaje z formulara s METHOD="GET").
Okrem vstupnych argumentov moze CGI program mnozstvo environmentalnych premennych, ktore nastavuje WWW server. Tieto premenne si opiseme v casti Environmentalne premenne v CGI.
Nacitanie argumentov z ARGV je bezproblemove. Horsie to je v zvysnych dvoch pripadoch. Predpokladajme takyto formular:
<FORM METHOD="GET" ACTION="/cgi-bin/pokus/skript.pl">
Login: <INPUT TYPE="text" NAME="username">
Password: <INPUT TYPE="password" NAME="password">
<INPUT TYPE="submit">
</FORM>
Dolezite: ak vam este nikto nepovedal, ze taketo nacitavanie hesla nie je bezpecne, hovorim vam to teraz ja. Tento formular je iba priklad.
Ako ste si vsimli, formular ma nastavenu metodu "GET". To znamena, ze vsetky
parametre a ich hodnoty sa prilepia k URL CGI programu za "?". Jednotlive
parametre su oddelene znakom "&". Medzera je nahradena znakom "+".
Vsetky znaky okrem pismen a cislic su dalej nahradene "escape" kodom v tvare
%hexa_cislo, ktore reprezentuje hexadecimalnu hodnotu daneho znaku v ASCII
tabulke. Ked napr. odoslem formular s hodnotami "vix" a "heslo", zobrazuje
(a spusti) sa URL:
http://fornax.sk/cgi-bin/pokus/skript.pl?username=vix&password=heslo
Okrem toho sa retazec s tymito parametrami vlozi aj do environmentalnej
premennej QUERY_STRING
. V pripade metody "POST" je retazec v
tom istom tvare na standardnom vstupe programu. Nastava klucovy problem -
ako nacitat parametre a ich hodnoty?
Ak si na to nenaprogramujete vlastny algoritmus (podla tych par viet, co som
napisal pred chvilou), mozete pouzit uz hotovy parser. Ak pouzivate Perl,
skuste najst na Altaviste skript
formlib.pl
. Je volne siritelny a funguje. Perl (aspon
distribucie pre Linux a Windows - nepredpokladam, ze robite na niecom
exotickejsom) navyse obsahuje kniznice (moduly) na pracu s HTML a CGI. Ja to
robim cez formlib, vy nemusite.
Priklad 1 (Perl): nacitanie hodnot a ich zobrazenie s vyuzitim "formlib.pl"
#!/usr/bin/perl require "formlib.pl"; print "Content-type: text/html\n\n"; # hlavicka s MIME typom &GetFormArgs(); # nacitanie hodnot formulara # formlib.pl ich ulozi do hash-pola %in print <<FIN; # vypis az po navestie FIN <HTML> <HEAD><TITLE>pokus</TITLE></HEAD> <BODY> <H1>Zadane hodnoty:</H1> Login: $in{username}<BR> # vypis hodnoty hash-pola s klucom Password: $in{password} # username resp. password (nase premenne </BODY> # z formulara!) </HTML> FIN # tu je navestie FIN
Environmentalne premenne v CGI
CGI program moze pocas behu vyuzit hodnoty environmentalnych premennych, ktore nastavil WWW server. Tu su niektore z nich s opisom:
Premenna | Opis | Ukazkova hodnota |
---|---|---|
REQUEST_METHOD | metoda, ktora bola pouzita na prenos udajov | GET |
QUERY_STRING | udaje z formulara | username=vix&password=password |
REMOTE_ADDR | adresa, z ktorej sa ziada zobrazenie stranky (adresa klienta alebo proxy servera). Mozete ju pouzit napr. pri kontrole pristupu. | axp.elf.stuba.sk |
SCRIPT_NAME | lokalna URI adresa spustaneho programu (v ramci priestoru WWW servera) | /cgi-bin/env.pl |
SCRIPT_FILENAME | plna cesta k programu | /services/httpd/cgi-bin/env.pl |
REQUEST_URI | URI vyziadaneho suboru (pre skripty je to samotny skript, pre server-side-includes stranka, z ktorej sa skript vola) | /cgi-bin/env.pl |
SERVER_NAME | meno a adresa (virtualneho) WWW servera | fornax.elf.stuba.sk |
HTTP_USER_AGENT | identifikacia prehliadaca | Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) |