Vložené příkazy pro server

Příkazy pro server jsou zapisovány ve formě komentářů. Komentáře, které obsahují hned na začátku znak # (bez mezery), jsou interpretovány jako příkazy pro server:
<!--#příkaz parametr="hodnota" parametr="hodnota" ... -->
Při odesílání dokumentu server interpretuje tyto příkazy a komentáře nahrazuje výsledkem vloženého příkazu. Například text na řádku s vloženým příkazem:
Poslední modifikace: <!--#flastmod file="$DOCUMENT_NAME"-->
je nahrazen při odeslání klientovi takto:
Poslední modifikace: 13. března 1998

Základní sada příkazů

Základní sada příkazů pro server je poměrně ustálená a interpretují je stejným způsobem servery servery NCSA, Apache a Netscape. Rozšířená sada příkazů pro server je již méně standardní a příkazy, které umí modul mod_html, jsou podobně implementovány ve standardním modulu mod_include serveru Apache. V následující tabulce je uveden přehled základních interpretovaných příkazů:

<!--#config errmsg="text"--> Nastavení chybové zprávy, která se vloží do zobrazeného dokumentu místo chybného vloženého příkazu. Implicitní text je v tom jazyce, ve kterém je dokument. Má tvar:
[při provádění vloženého příkazu došlo k chybě].
<!--#config timefmt="formát"--> Nastavení formátu výpisu času ve vložených příkazech flastmod. Implicitní formát je odvozen podle jazyka, ve kterém je dokument. Ve formátu lze použít vše, co je povoleno ve formátu funkce strftime().
<!--#config sizefmt="formát"--> Nastavení formátu výpisu velikosti souboru vw vložených příkazech fsize. Formát může být BYTE, což je výpis velikosti ve slabikách, nebo ABBREV, což je zkrácený výpis velikosti v jednotkách B, KB, MB. Implicitně je použit formát ABBREV.
<!--#echo var="proměnná"--> Výpis hodnoty proměnné proměnná (jméno proměnné je bez $ na začátku). Pokud není zadaná proměnná definována, vypíše se jako hodnota (none).
<!--#exec cmd="příkaz_shellu"--> Provedení příkazu shellu a vložení jeho výstupu do dokumentu. Protože výstup neobsahuje žádné hlavičky a nedá se proto rozpoznat, v jakém kódu je, musí být ve stejném kódu, jako je dokument. Výstup je pak překódován pro klienta stejným způsobem jako dokument. Uvnitř výstupu neprobíhá analýza odkazů, vložených příkazů pro server a nejsou vkládány explicitní přípony jména kódu a jazyku! Pokud generuje příkaz hypertextové odkazy, musí být patřičně upraveny dle proměnných prostředí.
<!--#exec cgi="URL"--> Provedení lokálního CGI skriptu zadaného pomocí URL včetně parametrů a vložení výstupu do dokumentu. Pokud URL není absolutní, vztahuje se relativně k dokumentu. Spouštění CGI skriptů v jiných adresářích, než je standardní (cgi-bin) musí být povoleno v konfiguraci serveru (parametr ExecCGI).

CGI skript musí generovat na prvním řádku výstupu standardní hlavičku "Content-type: text/html; charset=xxx". Výstup CGI skriptu může být v libovolném kódu, je překódován podle požadavků klienta do stejného kódu, jako je hlavní dokument.

CGI skript může také pouze vygenerovat hlavičku Location: URL. V tomto případě bude do dokumentu vložen hypertextový odkaz <A HREF="URL">URL</A>.

<!--#flastmod file="soubor"--> Vložení času poslední změny souboru soubor. Soubor musí být ve stejném adresáři jako dokument, nebo v některém podadresáři. Čas je vložen ve stejném jazyce, jako je dokument. Formát času je dle konvencí daného jazyka, dá se nastavit příkazem config timefmt.
<!--#flastmod virtual="URL"--> Vložení času poslední změny souboru. Soubor může být kdekoli v adresářové struktuře serveru. Kořen URL (adresář /) odpovídá kořenu stromu dokumentů. Čas je vložen ve stejném jazyce, jako je dokument. Formát času je dle konvencí daného jazyka, dá se nastavit příkazem config timefmt.
<!--#fsize file="soubor"--> Vložení velikosti souboru. Soubor musí být ve stejném adresáři jako dokument, nebo v některém podadresáři. Formát výpisu velikosti je dán příkazem config sizefmt.
<!--#fsize virtual="URL"--> Vložení velikosti souboru. Soubor může být kdekoli v adresářové struktuře serveru. Kořen (adresář /) odpovídá kořenu stromu dokumentů. Formát výpisu velikosti je dán příkazem config sizefmt.
<!--#include file="soubor.html"--> Vložení textu souboru soubor.html. Soubor musí být ve stejném adresáři jako dokument, nebo v některém podadresáři. Vkládaný soubor musí být typu "text/html". Zpracování vloženého souboru probíhá tak, jako by byl zpracováván samostatně, je tedy plně analyzován, může obsahovat vložené příkazy pro server (včetně zanořených #include) a je překódován do kódu dle požadavků klienta.
<!--#include virtual="URL"--> Vložení souboru. Soubor může být kdekoli v adresářové struktuře serveru. Kořen URL (adresář /) odpovídá kořenu stromu dokumentů. Vkládaný soubor musí být typu "text/html".
V parametrech vložených příkazů jsou expandovány proměnné prostředí serveru a proměnné CGI skriptů. Kromě těchto proměnných jsou u vložených příkazů #exec a #include k dispozici dále proměnné prostředí:
DATE_GMTAktuální čas GMT ve standardním formátu.
DATE_LOCALAktuální lokální čas ve standardním formátu.
DOCUMENT_NAMEÚplné jméno hlavního souboru, který požadoval klient. Toto jméno zůstává ve vložených souborech a spuštěných programech pevné. Lze tedy ve standardní patce, která je vložena na konci dokumentu X, vypsat čas poslední změny dokumentu X takto:
<!--#flastmod file="$DOCUMENT_NAME"-->
DOCUMENT_URIČást URL, která obsahuje přístupovou cestu souboru (jména adresářů a souboru), který požadoval klient. Toto jméno zůstává ve vložených souborech a spuštěných programech pevné.
LAST_MODIFIEDČas poslední modifikace souboru, který požadoval klient. Tento čas zůstává ve vložených souborech a spuštěných programech pevný.

Rozšířené vložené příkazy (od verze mod_html-3.0)

<!--#set var="proměnná"
value="hodnota"-->
Nastavení proměnné proměnná (bez $) na hodnotu hodnota. Proměnnou lze dálo použít v parametrech vložených příkazů a v příkazu #echo. Výskyt proměnné (se znakem $ na začátku) je nahrazen hodnotou proměnné.
<!--#if expr="výraz"--> Podmíněné generování dokumentu. Pokud je výsledkem výrazu výraz hodnota TRUE, je následující část dokumentu až po odpovídající #else, #elif nebo #endif normálně zpracovávána. Pokud je výsledkem výrazu FALSE, je následující část dokumentu až po odpovídající #else, #elif nebo #endif ignorována a nazasílá se klientovi. Příkazy #if mohou být zanořeny až do 15 úrovní.
<!--#else--> Konec podmíněně generované varianty dokumentu zahájené příkazem #if. Pokud byla předchozí část generována (výsledkem #if bylo TRUE), pak je následující část až po #endif ignorována. Pokud nebyla předchozí část generována (výsledkem #if bylo FALSE), pak je následující část až po #endif normálně zpracována.
<!--#endif--> Konec podmíněně generované varianty dokumentu zahájené příkazem #if.
<!--#elif expr="výraz"--> Zkrácený příkaz #else a #if. Výraz se interpretuje pouze v případě, že nebyla žádná předchozí větev odpovídajícího příkazu #if (#elif) vyhodnocena kladně (hodnota TRUE). Příkaz #elif nemůže následovat v podmíněném příkazu za příkazem #else.

Výrazy v podmíněných příkazech

řetězec TRUE, pokud není řetězec prázdný
řetězec1 relop řetězec2 Výsledek srovnání dvou řetězců, relační operátor relop může být =, !=, <, >, <=, >=.
řetězec1 ~ řetězec2 Srovnání řetězce řetězec1 s regulárním výrazem řetězec2. Výsledkem je TRUE, pokud je v řetězci nalezen podřetězec popsaný regulárním výrazem.
( výraz ) Výsledkem je hodnota výrazu v závorkách.
! výraz Výsledkem je negace výrazu.
výraz && výraz ... Logický AND zapsaných výrazů.
výraz || výraz ... Logický OR zapsaných výrazů.

řetězec je:

Priorita operátorů:

  1. !
  2. =, !=, <, >, <=, >=, ~, !~
  3. && ||
  4. ( )

Příklad

Ve společném #include má být doplněn postfix jazyka (pro tlačítko přepnutí na anglickou verzi) do odkazu na dokument, ve kterém je #include použit:
<!--#set var="tmp_link" value="<a href='$DOCUMENT_URI.en'>"-->
<!--#echo var="tmp_link"--><img src="/icons/english.gif" border="0"></a>
Prvním příkazem #set je vygenerován do proměnné tmp_link kompletní řetězec odkazu s doplněním explicitní přípony pro přepnutí na alternativní jazykovou verzi. Příkazem #echo je hodnota proměnné vložena do dokumentu, takže vznikne:
<a href='file.html.en'><img src="/icons/english.gif" border="0"></a>
Takto je například řešeno přepínání jazyka na stránkách UIVT. Obecné řešení ošetřující explicitní volbu kódu i CGI skripty je ovšem poněkud složitější, je zde uvedena pouze varianta pro českou verzi:
<!--#if expr="x$QUERY_STRING = x"-->
<!--#if expr="x$HTTP_FORCED_CHARSET != x"-->
<!--#set var="tmp_link" value="<a href='$DOCUMENT_URI.en.$HTTP_FORCED_CHARSET'>"-->
<!--#else-->
<!--#set var="tmp_link" value="<a href='$DOCUMENT_URI.en'>"-->
<!--#endif-->
<!--#else-->
<!--#if expr="x$HTTP_FORCED_CHARSET != x"-->
<!--#set var="tmp_link" value="<a href='$SCRIPT_NAME.en.$HTTP_FORCED_CHARSET?$QUERY_STRING'>"-->
<!--#else-->
<!--#set var="tmp_link" value="<a href='$SCRIPT_NAME.en?$QUERY_STRING'>"-->
<!--#endif-->
<!--#endif-->
<!--#echo var="tmp_link"--><img src="/UIVT/img/flag2_gb.gif" alt="" border="0" width="26" height="20"></a>
Varianta pro anglickou verzi společné hlavičky vypadá stejně, pouze všechny zkratky "en" jsou nahrazeny "cs".

Příklad:

Generování navigační lišty. Na stránkách UIVT je generován obsah navigační lišty z jednoho souboru podle umístění dokumentu, ve kterém je navigační lišta použita. Princip je založen na testování proměnné DOCUMENT_URI (SCRIPT_NAME), která zůstává ve vloženém souboru nastavená podle hlavního souboru.
<!--#if expr="x$DOCUMENT_URI != x"-->
<!--#set var="doc_name" value="$DOCUMENT_URI"-->
<!--#else-->
<!--#set var="doc_name" value="$SCRIPT_NAME"-->
<!--#endif-->

<!-- Hlavní navigační lišta, položka pro /UIVT/department -->
<!--#if expr="$doc_name = /UIVT/department/index.html" -->

### Zobrazujeme index, zobrazit ikonku "v" a mrtvý odkaz na index ###

<!--#elif expr="$doc_name >= /UIVT/department/A && $doc_name <= /UIVT/department/z" -->

#### Jsme uvnitř /UIVT/department, zobrazit ikonku "v" a živý odkaz na index ####

<!--#else-->

### Jsme někde jinde, zobrazit ikonku ">" a živý odkaz na index

<!--#endif-->
<!-- konec položky pro /UIVT/department -->

<!-- Obsah /UIVT/department, vygenerován pouze pokud jsme uvnitř -->
<!--#if expr="$doc_name >= /UIVT/department/A && $doc_name <= /UIVT/department/z" -->

### Jsme uvnitř /UIVT/department, generovat obsah do navigační lišty

<!-- Položka /UIVT/deparment/history.html -->
<!--#if expr="$doc_name = /UIVT/department/history.html" -->

### Jsme na history, generovat ikonku "o" a mrtvý odkaz na history

<!--#else-->

### Jsme jinde, generovat ikonku ">" a živý odkaz na history

<!--#endif-->
<!-- konec /UIVT/deparment/history.html -->

...

<!--#endif-->
<!-- konec /UIVT/deparment -->

...

Příklad:

Doplnění kontextu zvoleného jazyka a kódu do odkazů generovaných v PHP4:
$forced = @$_SERVER["FORCED_SUFFIX"];
...

echo "<a href=\"URL$forced\">odkaz</a>";

Poslední změna: 8. April 2003
Pokud máte námět na vylepšení této stránky nebo na ní naleznete chybu, zašlete dopis na adresu lampa@fit.vutbr.cz.

[ Zpět | Domácí stránka | Web server | Jazyk/Language ]