CGI skripty

Modul mod_html filtruje výstup běžných CGI skriptů a může tak podle potřeby překódovat výstup skriptu. Tato vlastnost neplatí pro nph-skripty (skripty, které generují všechny hlavičky a nejsou filtrovány serverem). Oproti běžnému použití CGI skriptů v serveru Apache lze s modulem mod_html využít některé další proměnné prostředí pro jazykově závislé zpracování a navázání překódování výstupu.

Výstupní hlavičky

Každý CGI skript, který generuje výstup, musí vygenerovat hlavičku Content-Type, případně další hlavičky a poté prázdný řádek. Prázdný řádek signalizuje konec hlaviček a začátek vlastních dat. CGI skripty, které generují výstup v jiném kódu, než ISO-8859-1, musí v hlavičce Content-Type signalizovat použitý kód:
Content-Type: text/html; charset=iso-8859-2

Toto je výstup v kódu ISO-8859-2
...
Pokud není parametr charset v hlavičce uveden, předpokládá se, že výstup je v kódu ISO-8859-1. Až do verze mod_html 2.3 včetně byl kód výstupu odvozován podle jazyka, u novějších verzí to již neplatí!

Jazykové mutace

Při použití skriptů je třeba rozlišit dva základní přístupy. Buď je pro daný CGI skript použit výběr mutace serverem nebo není.

1. Jazykové mutace skriptů

V prvním případě existují různé jazykové varianty skriptu a každá takováto varianta má jméno souboru doplněné příponou zkratky jazyka:
	/WWW/cgi-bin/script.cz
	/WWW/cgi-bin/script.en
Tento postup je stejný jako při vytváření jazykových mutací dokumentů. V tomto případě se na skript odkazujeme pomocí URL "/cgi-bin/script" a server vybere požadovanou mutaci podle preferencí klienta. Předpokladem samozřejmě je, že pro adresář CGI skriptů je povolen parametr MultiViews. Skript generuje výstup přímo v daném jazyce. Skript by měl generovat hlavičku Content-Language se správným obsahem:
Content-Type: text/html; charset=iso-8859-2
Content-Language: cs

Toto je výstup v jazyce cs a kódu ISO-8859-2
...
Kód výstupu může být libovolný, podle potřeby je případně překódován do kódu, který požaduje klient.

Jazykově neutrální nebo univerzální skript

V druhém případě existuje pouze jeden skript a výběr podle jazyka, typu a kódu není uplatněn. V tomto případě musí skript sám určit z proměnné prostředí HTTP_ACCEPT_LANGUAGE, v jakém jazyce je požadován výstup . Problémem zde je, že odpovídající hlavička Accept-Language může mít poměrně složitý tvar, např.:

Accept-Language: en;q=0.9, en-gb;q=0.99, de;q=0.7
Nelze tedy jednoduše testovat HTTP_ACCEPT_LANGUAGE na zkratku jména jazyka! Skript by měl generovat na výstupu hlavičku Content-Language, ale její obsah musí být kompatibilní s hlavičkou Accept-Language. Pokud by nebyl, může se stát, že při následném výběru požadovaného kódu bude shledána oznámená varianta nepřijatelnou a výsledkem bude odpověď NOT_ACCEPTABLE. Pokud tedy skript neumí spolehlivě určit přijatelný jazyk podle HTTP_ACCEPT_LANGUAGE, neměl by generovat hlavičku Content-Language! Kód výstupu může být opět libovolný, podle potřeby je překódován do kódu, který požaduje klient.

Zpracování výstupu skriptu

Skript může generovat výstup v libovolném kódu, ale musí jej oznámit v hlavičce Content-Type. Modul mod_html zjistí kód výstupu z této hlavičky a pokud nebyl před spuštěním skriptu proveden výběr jazykové mutace (druhá metoda) nebo nesouhlasí podmínky výběru (první metoda a výstup je v jiném jazyce nebo kódu než byl očekáván), pak provede volbu kódové mutace dokumentu podle preferencí klienta (v tomto případě nemusí být zapnut parametr MultiViews pro adresář, ve kterém leží skript). Výsledkem je obvykle úspěšná volba toho kódu, který požaduje klient, ale výsledkem může být také neúspěšný výběr (výstup skriptu neodpovídá požadavkům klienta). Při neúspěšném výběru je výstup skriptu ignorován a klient dostane pouze signalizaci chyby (NOT ACCEPTABLE nebo MULTIPLE_CHOICE).

Pokud byl výběr úspěšný, dostane klient výstup v požadovaném kódu, což může být jiný, než který skript oznámil a generuje. Při překódování výstupu modul mod_html zároveň doplní do odkazů v dokumentu kontext (zvolený kód a případně jazyk) a zpracuje vložené příkazy.

Nové proměnné prostředí

Obsah pomocných proměnných prostředí závisí na zvolené metodě realizace jazykově závislých skriptů. V prvním případě proběhne před spuštěním skriptu algoritmus výběru varianty a skript dostane parametry zvolené varianty v proměnných prostředí CHARSET_TO a LANGUAGE. V druhém případě musí skript analyzovat hlavičku Accept-Language sám. Dostane pouze signalizaci, zda byl v URL zadán postfix určující požadovaný jazyk a kód (HTTP_FORCED_CHARSET a HTTP_FORCED_LANGUAGE).
CHARSET_TO Doporučený kód výstupu podle preferencí klienta. Je roven HTTP_FORCED_CHARSET, resp. HTTP_CHARSET_TO. Pokud klient generuje výstup v tomto kódu, nebude již dále překódován za předpokladu, že souhlasí i výstupní jazyk podle LANGUAGE. Klient může toto doporučení ignorovat a generovat výstup v kódu, který se mu hodí.
FORCED_SUFFIX Explicitní požadovaná přípona dokumentu obsahující zvolený jazyk a kód. Pokud není zvolen explicitní jazyk nebo kód, prázdný řetězec.
HTTP_FORCED_CHARSET Explicitní požadovaný kód z postfixu URL. Pokud není, prázdný řetězec.
HTTP_CHARSET_TO Dohodnutý kód výstupu podle preferencí klienta. Má význam pouze v případě, že HTTP_FORCED_CHARSET nemá hodnotu. Pokud nelze kód určit, prázdný řetězec.
LANGUAGE Požadovaný jazyk výstupu. Odpovídá HTTP_FORCED_LANGUAGE, resp. příponě jména skriptu.
HTTP_FORCED_LANGUAGE Explicitní požadovaný jazyk z postfixu URL. Pokud není, prázdný řetězec.
Při použití první metody (jazykové varianty skriptů) může nastat případ, že kód oznámený proměnnou CHARSET_TO není skutečným výstupním kódem. Nastane to v případě neshody očekávaného kódu výstupu skriptu se skutečným. Například pro skript /cgi-bin/printenv.cz je podle konfigurace očekáván výstupní kód ISO-8859-2 (LanguageCharset cs iso-8859-2). Podle tohoto očekávání je proveden výběr varianty dle preferencí uživatele a nastavena proměnná CHARSET_TO. Pokud skript ale ve skutečnosti vygeneruje výstup v kódu WINDOWS-1250, musí být proveden výběr varianty znovu. Při tomto dodatečném výběru může být kód výstupu akceptovatelný nebo zvolen jiný cílový kód, či ponechán původní cílový kód.

Jak zjistit jméno skutečného výstupního kódu

Vzhledem k možnosti dodatečného výběru kódové varianty po provedení skriptu nemůže skript spolehlivě zjistit jméno skutečného výstupního kódu. Nicméně ale může do textu výstupu vložit příkaz pro modul mod_html, který vloží do výstupu jméno skutečného výstupního kódu:
	<!--#echo var="CHARSET_TO"-->
Proměnná CHARSET_TO je při zpracování vloženého příkazu nahrazena jménem skutečného výstupního kódu.

Další způsob, jak dostat jméno skutečného výstupního kódu, je použít expanzi proměnných ve formulářových značkách <INPUT>. V těchto značkách je v atributu VALUE prováděna expanze proměnných stejně jako ve vložených příkazech pro server, takže lze zapsat:

	<INPUT TYPE=HIDDEN NAME=CHARSET VALUE="$CHARSET_TO">

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 ]