Dosud jsme se zab²vali p°φpady, kdy urΦitΘ URL adrese odpovφdal na serveru soubor, kter² obsahoval HTML-k≤d dopln∞n² p°φpadn∞ o n∞jakΘ v²konnΘ p°φkazy (SSI, ASP, PHP), kterΘ se p°ed odeslßnφm dokumentu provedly. URL vÜak m∙₧e ukazovat p°φmo na spustiteln² soubor, kter² po svΘm spuÜt∞nφ vygeneruje HTML strßnku. SpustitelnΘmu souboru °φkßme obvykle CGI-skript, podle rozhranφ CGI (Common Gateway Interface), kterΘ definuje zp∙sob p°edßvßnφ dat mezi WWW-serverem a CGI-skriptem.
Aby byl v²sledn² program pou₧iteln² jako CGI-skript, musφ spl≥ovat pouze dv∞ podmφnky:
Server zjistφ, ₧e po₧adovanΘ URL je pot°eba obslou₧it CGI-skriptem.
Server to nejΦast∞ji poznß podle toho, ₧e na zaΦßtku cesty v URL je
uveden adresß° cgi-bin
. (JmΘno tohoto adresß°e lze nastavit
v serveru Apache pomocφ direktivy ScriptAlias
v
konfiguraΦnφm souboru srm.conf
). Server skript spustφ a
p°edß mu parametry pomocφ rozhranφ CGI.
Nynφ hlavnφ slovo dostßvß CGI-skript. Zpracuje p°edanΘ parametry a jako v²sledek na sv∙j standardnφ v²stup zapφÜe odpov∞∩ ve tvaru protokolu HTTP. Tento v²stup je zachycen WWW-serverem, kter² doplnφ dalÜφ hlaviΦky do HTTP odpov∞di a vÜe poÜle zp∞t klientovi jako odpov∞∩. (V tΘto fßzi se WWW-server obvykle chovß pon∞kud prot°ele a starß se o to, aby odpov∞∩ byla zaslßna stejnou verzφ HTTP jakou pou₧il po₧adavek. Pokud tedy byl po₧adavek vznesen pomocφ HTTP/0.9, odstranφ WWW-server p°ed odeslßnφm v²stupu CGI-skriptu vÜechny HTTP hlaviΦky.)
Pokud mßme vytvß°enφ CGI-skript∙ povoleno, musφme si rovn∞₧ zjistit,
do kterΘho adresß°e je m∙₧eme uklßdat. Obvykle b²vß vyhrazen jeden
spoleΦn² adresß° (a jeho podadresß°e) pro vÜechny u₧ivatele. Na Unixu
tento adresß° b²vß nap°. /usr/local/etc/httpd/cgi-bin
, ve
Windows instalaci serveru Apache pak x:\Apache\cgi-bin
.
Pokud do tohoto adresß°e ulo₧φme skript pojmenovan²
pokus.cgi
, bude p°φstupn² pomocφ URL
http://server/cgi-bin/pokus.cgi
.
Nynφ jsou zdßnliv∞ vÜechny problΘmy vy°eÜeny. Opak je vÜak pravdou.
Nynφ nßm zb²vß vybrat programovacφ jazyk, ve kterΘm budeme CGI-skripty
psßt. Pravd∞podobn∞ si vybereme ten jazyk, kter² dob°e ovlßdßme. Pro
zßpis naÜeho ukßzkovΘho skriptu pou₧iji p°φkazov² interpret
sh
, kter² je nedφlnou souΦßstφ vÜech instalacφ operaΦnφho
systΘmu Unix. Skripty pro sh
jsou obdobou dßvkov²ch
soubor∙, jak je znßme jeÜt∞ z dob MS-DOSu. NaÜe ukßzka vÜak bude tak
jednoduchß, ₧e ji pochopφte i bez znalosti interpretu sh
.
Vytvo°φme skript, kter² vypφÜe seznam u₧ivatel∙, kte°φ prßv∞ na
serveru pracujφ. (V Unixu toti₧ m∙₧e na jednom poΦφtaΦi pracovat vφce
u₧ivatel∙ najednou.) K v²pisu prßv∞ p°ihlßÜen²ch u₧ivatel∙ slou₧φ p°φkaz
who
. Ten budeme proto volat z naÜeho skriptu, kter² krom∞
toho vytvo°φ pot°ebnΘ hlaviΦky HTTP. V praxi v∞tÜinou staΦφ pou₧φt pouze
hlaviΦku Content-type
a urΦit typ dat, kterß dßle bude
skript generovat. Jeliko₧ p°φkaz who
generuje obyΦejn²
textov² v²stup, m∙₧eme pou₧φt typ dat text/plain
--
obyΦejn² text. Skript ulo₧φme nap°. do souboru test1.cgi
.
#!/bin/sh echo 'Content-type: text/plain' echo /usr/bin/whoSkript je pom∞rn∞ krßtk², my se na n∞j podφvßme troÜku podrobn∞ji a vÜe si vysv∞tlφme. Prvnφ, pon∞kud magickß, °ßdka skriptu urΦuje, kter² p°φkazov² interpret se pou₧ije pro vykonßnφ skriptu -- v naÜem p°φpad∞ tedy
sh
, kter² je ulo₧en v adresß°i bin
.
P°φkaz echo
vypisuje sv∙j argument na standardnφ v²stup.
Druhß a t°etφ °ßdka CGI-skriptu tedy vygeneruje HTTP hlaviΦku (typ dat a
prßzdnß °ßdka). ╚tvrt² °ßdek zavolß p°φmo p°φkaz who
.
V²stup p°φkazu je zaslßn na standardnφ v²stup a proto se u₧ o nic
nemusφme starat.
U souboru test1.cgi
musφme jeÜt∞ sprßvn∞ nastavit
atributy tak, aby byl soubor spustiteln². K tomu nßm poslou₧φ p°φkaz
chmod +x test1.cgi
.
V²sledek naÜeho sna₧enφ si m∙₧eme prohlΘdnout na obrßzku 2. Funguje to, ale jaksi to nenφ ono. V²stup je p°φliÜ stroh² a zdaleka nevyu₧φvß mo₧nosti, kterΘ nßm Web nabφzφ.
Vyu₧ijeme toho, ₧e CGI-skript m∙₧e klidn∞ generovat HTML-k≤d. StaΦφ,
kdy₧ v HTTP hlaviΦce pou₧ijeme Content-type: text/html
a
v²stup skriptu se bude v prohlφ₧eΦi interpretovat jako strßnka zapsanß
HTML. Upravφme tedy nßÜ skript do novΘ podoby a pojmenujeme jej nap°.
test2.cgi
(op∞t nesmφme zapomenout na nastavenφ atributu
spustitelnosti):
#!/bin/sh echo 'Content-type: text/html' echo echo '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">' echo '<HTML>' echo '<TITLE>P°ihlßÜenφ u₧ivatelΘ</TITLE>' echo '</HEAD>' echo '<BODY>' echo '<H1>P°ihlßÜenφ u₧ivatelΘ</H1>' echo '<PRE>' /usr/bin/who echo '</PRE>' echo 'V p°φpad∞ problΘm∙ a dotaz∙ kontaktuj' echo '<A HREF="mailto:webmaster@server.cz">Webmastera</A>.' echo '</BODY>' echo '</HTML>'Pomocφ p°φkaz∙
echo
jsme vygenerovali vÜechen pot°ebn²
HTML-k≤d. V²stup programu who
jsme umφstili mezi tagy
<PRE>
a </PRE>
, aby bylo zachovßno
°ßdkovanφ. V²sledek novΘho skriptu je ji₧ mnohem uspokojiv∞jÜφ (obr.
3.).
Po opravdu krßtkΘm ·vodu do problematiky CGI na nßs v nßsledujφcφm pokraΦovßnφ serißlu bude Φekat popis p°edßvßnφ parametr∙ pomocφ rozhranφ CGI. Teprve potΘ mohou b²t naÜe skripty interaktivnφ a aktivn∞ reagovat na pot°eby u₧ivatel∙.
U₧ dnes si vÜak m∙₧e polo₧it otßzku, zda je lepÜφ pou₧φvat
CGI-skripty nebo n∞kter² z modernφch systΘm∙ serverov²ch vsuvek jako PHP
nebo ASP. Ve v∞tÜin∞ p°φpad∙ je mnohem snazÜφ a rychlejÜφ pro v²voj
aplikacφ pou₧φt PHP nebo ASP. Pou₧itφ klasick²ch CGI-skript∙ je v²hodnΘ
v p°φpadech, kdy "toho pot°ebujeme hodn∞ spoΦφtat a mßlo zobrazit" --
vid∞li jsme, ₧e vÜechen HTML-k≤d se v CGI-skriptech musφ pom∞rn∞ pracn∞
zapisovat pomocφ p°φkazu echo
nebo n∞jakΘ jeho obdoby. Jak
uvidφme p°φÜt∞, proti pou₧itφ CGI hovo°φ i slo₧it∞jÜφ prßce s parametry
a potencionßln∞ v∞tÜφ bezpeΦnostnφ rizika.