Server Side Includes

Jiří Kosek ml.

Server Side Includes (SSI) je nejstarší a nejrozšířenější druh serverem vkládaných vsuvek. Dnes jej podporují snad všechny běžně dostupné WWW-servery.

Princip SSI spočívá v tom, že do zápisu stránky v HTML můžeme doplnit některé příkazy zapsané ve speciálním formátu. WWW-server HTML stránku před odesláním klientovi (prohlížeči) prohlédne a všechny vložené příkazy provede.

SSI se do stránky vkládají v následujícím tvaru:

<!--#příkaz parametr="hodnota"-->
Vidíme, že SSI se uzavírají do HTML komentáře (<!-- ... -->). Důvod je jednoduchý: Pokud server neumí SSI příkaz interpretovat a neprovede jej, dorazí do prohlížeče SSI jako obyčejný komentář, který neovlivní výsledné zobrazení stránky.

Ještě než se podíváme na příkazy, které SSI nabízí tvůrcům stránek, seznámíme se s několika důležitými fakty. Předně musíme zdůraznit, že ne všechny servery podporují SSI samy od sebe. Zejména komerčně pronajímané servery poskytovatelů připojení mívají podporu SSI z bezpečnostních důvodů vypnutou. Před používáním SSI je tedy vždy nutné zjistit od správce serveru, zda máme právo SSI používat.

Aby server nemusel před odesláním prohlížeči kontrolovat přítomnost SSI ve všech .html souborech, ukládají se stránky s SSI obvykle do souborů s příponou .shtml. WWW-server je pak nakonfigurován tak, aby SSI prováděl v těchto souborech. Toto opatření pomáhá zvýšit výkon serveru v případech, kdy SSI obsahují pouze některé stránky.

#include

SSI #include slouží ke vložení souboru do stránky. Jméno vkládaného souboru je určeno parametrem file. Nejčastější použití příkazu je pro vložení standardizovaných hlaviček a patiček do většího počtu stránek.

Jako hodnotu parametru file je možno zadat pouze relativní cestu. Pokud chceme pracovat i s absolutními cestami použijeme parametr virtual. Kořenový adresář v tomto případě však odpovídá kořenovému adresáři dokumentů WWW-serveru. U virtual lze samozřejmě používat i relativní cesty.

Časté využití bývá právě pro patičky se základními informacemi o firmě. Patička se pak přidává ke každé stránce a při změně firemních údajů je stačí změnit ve vkládaném souboru.

Malá ukázka. Do souboru /includes/signature.inc uložíme standardizovanou patičku:

<DIV ALIGN=CENTER>
<B>&copy; Copyright OneBig Inc. 1998</B><BR>
Senovážné nám. 3, Praha 1, 101 00<BR>
tel.: +420+2+2456 8791<BR>
e-mail: <A HREF="mailto:info@onebig.cz">info@onebig.cz</A>
</DIV>
Do všech firemních stránek pak nakonec vložíme jednoduchou SSI, která se postará o připojení patičky:
<HTML>
<HEAD>
<TITLE>OneBig Inc.</TITLE>
</HEAD>
<BODY>
<H1>Nabídka služeb firmy OneBig Inc.</H1>
...další informace...
<!--#include virtual="/include/signature.inc"-->
</BODY>
</HTML>
Výsledek našeho snažení si můžeme prohlédnout na obrázku.

Stránka s patičkou vloženou pomocí SSI

#fsize

Tento příkaz má stejné parametry jako #include. Výsledkem je však číslo udávající velikost souboru, na který se odkazujeme parametrem file nebo virtual.

#flastmod

Příkaz do stránky vloží datum poslední modifikace souboru. Soubor se určuje stejně jako u příkazu #include.

#echo

Vsuvka s příkazem #echo se nahradí obsahem proměnné specifikované pomocí parametru var. Proměnné, které můžeme použít jsou:

DATE_GMT datum a čas serveru v Greenwichském čase
DATE_LOCAL datum a čas serveru
DOCUMENT_NAME jméno dokumentu, který si prohlížeč vyžádal od serveru
DOCUMENT_URI URL adresa dokumentu, který si prohlížeč vyžádal od serveru
LAST_MODIFIED datum a čas poslední změny souboru

Pokud chceme, aby na každé stránce byl uveden čas její poslední modifikace, můžeme použít následující SSI:

Poslední modifikace: <!--#echo var="LAST_MODIFIED"-->

#exec

Tento příkaz vloží do stránky výstup programu, který je specifikován pomocí parametru cmd nebo cgi. V prvním případě parametr obsahuje jméno nějakého spustitelného souboru. Pokud použijeme parametr cgi, jako jeho hodnotu musíme uvést URL adresu CGI-skriptu, jehož výstup chceme do stránky zařadit.

Mnoho serverů je nakonfigurováno tak, že SSI podporují kromě příkazu #exec. Běžný uživatel tak nemůže vyvolat spuštění programu, který by mohl potenciálně ohrozit bezpečnost celého serveru.

#config

Příkaz #config ovlivňuje formát zobrazení velikostí souborů, údajů o datu a čase a chybových hlášení.

První parametr, který můžeme použít, je errmsg. Jako jeho hodnota se uvádí text, který se uživateli zobrazí, pokud se serveru nepodaří nějaký SSI příkaz provést (chybná syntaxe, odkaz na neexistující soubor apod.):

<!--#config errmsg="Chyba v SSI!"-->

Parametrem sizefmt určujeme formát výpisů velikosti souboru (#fsize). Jako hodnotu parametru můžeme použít buď bytes nebo abbrev. V prvním případě se velikosti souborů vypisují v bajtech, ve druhém pak v KB nebo MB.

Formát zobrazení data a času ovlivňujeme parametrem timefmt. Jako hodnota se uvádí formátovací řetězec. Jeho syntaxe je převzata z funkce strftime jazyka C. Formátovací řetězec může kromě běžného textu obsahovat speciální značky, kterými lze do textu vložit např. měsíc, jméno dne v týdnu apod. Značky mají tvar %x a jejich úplný přehled nalezneme v tabulce.

Značky použitelné ve formátovacím řetězci timefmt
%a Zkrácené jméno dne v týdnu (např. Po)
%A Úplné jméno dne v týdnu (např. pondělí)
%b Zkrácené jméno měsíce (např. Jan pro leden)
%B Úplné jméno měsíce (např. leden)
%c Formát data a času, který odpovídá národním zvyklostem nastaveným na serveru
%d Den v měsíci (01-31)
%H Hodina v 24hodinovém formátu (00-24)
%I Hodina v 12hodinovém formátu (01-12)
%j Den v roce (001-366)
%m Měsíc (01-12)
%M Minuta (00-59)
%p indikátor toho, zda je dopoledne či odpoledne (např. AM/PM v angličtině)
%S Sekunda (00-59)
%U Číslo týdne v roce (pokud bereme neděli jako první den týdne /00-51/)
%w Den v týdnu (pokud bereme neděli jako první den týdne /0-6/).
%W Číslo týdne v roce (pokud bereme pondělí jako první den týdne /00-51/)
%x Formát data, který odpovídá národním zvyklostem nastaveným na serveru
%X Formát času, který odpovídá národním zvyklostem nastaveným na serveru
%y Rok ve století (např. 75)
%Y Rok včetně určení století (např. 1975)
%Z Zkratka časového pásma
%% Znak procenta

Našim potřebám asi nejlépe vyhoví formátovací řetězec "%d. %m. %Y" pro datum a "%H.%M" pro čas (s přesností na minuty). Vsuvku zobrazující datum poslední modifikace stránky můžeme upravit následujícím způsobem:

<!--#config timefmt="%d. %m. %Y v %H.%M"-->
Poslední modifikace: <!--#echo var="LAST_MODIFIED"-->

Počítadlo přístupů jako serverem vkládaná vsuvka

Počítadla přístupů ke stránce jsou velice oblíbené jak u tvůrců stránek (kteří jsou pyšní na návštěvnost své stránky), tak i u návštěvníků stránek ("to budou kvalitní stránky, když se na ně kouká tolik lidí").

Většina počítadel přístupů, se kterými se setkáváme, jsou ve skutečnosti malé obrázky, které jsou generovány CGI-skriptem. Toto řešení má však několik nevýhod. Jednak je načítání stránky s počítadlem ve formě obrázku pomalé -- pro přenesení obrázku, který má několik set bajtů, se musí otevřít nové komunikační spojení se serverem. Počítadlo přístupů není vidět v textových prohlížečích (jako je Lynx) anebo pokud máme vypnuto zobrazování obrázků. To by ještě však nebylo tak katastrofální. Horší je, že počítadla na této bázi vůbec přístupy pomocí textových prohlížečů neregistrují -- prohlížeč se obrázek nesnaží načíst a nevyvolá se tudíž CGI-skript, který zvyšuje čítač přístupů.

Všechny tyto problémy lze velice elegantně vyřešit počítadlem vloženým pomocí SSI. Jako SSI totiž můžeme vložit volání libovolného programu. Tento program bude udržovat databázi počty přístupů k jednotlivým stránkám. Při svém vyvolání zjistí stránku, ze které byl zavolán (z proměnné DOCUMENT_URI), zvětší počet návštěv o jedničku a na svůj výstup zapíše aktualizovaný počet přístupů. Údaj o počtu přístupů pak putuje jako několik znaků přímo v textu stránky. Odpadá tedy nutnost přenosu nepoměrně většího množství dat po dalším TCP/IP spojení.

Prakticky výše nastíněný způsob realizuje např. počítadlo přístupů access_count od Chucka Muscianiho. Lze si jej stáhnout na adrese http://members.aol.com/htmlguru/access_counts.html.

Program stačí přeložit libovolným kompilátorem jazyka C a umístit do nějakého vhodného adresáře (např. /usr/local/http/bin). Na místo, kde chceme mít v dokumentu zobrazen počet přístupů, pak vložíme následující SSI:

Jste 
<!--#exec cmd="/usr/local/http/bin/access_count"-->.
návštěvník stránky od 21. února 1996.
© Jiří Kosek 1999