Apache: přepis adres ve stránce

06.11.2007, 19:57
Poslední změna: 06.11.2007, 20:36
Tagy: Web

Občas mi něco chybí a přemýšlím, jak by se to dalo realizovat. Jednou jsem takhle přemýšlel, že by bylo hezké mít vyhledávač v linuxové dokumentaci (man, info, referenční příručky apod.) Vyhledávalo by se podle klíčového slova (jako man) a následně fulltextově. Jako doplněk by mohl být k dispozici i přehledný browser všech manuálů.

Realizaci ale zatím odložím :-) Pohrál jsem si jen s online prohlížečem manuálových stránek, který už kdosi implementoval (bohužel s několika dírami, o kterých nevím, zda jsou již opravené, takže adresu mého testovacího serveru sem raději nedám) – program se jmenuje man2html a umožňuje i fulltextové vyhledávání. V Debianu je vše připraveno v balíčcích, zprovoznení bylo otázkou několika minut. Jenže výsledná adresa je taková ošklivá – hostname/cgi-bin/man/man2html. Komu by se to líbilo. Cílem bude tuhle adresu změnít na hostname/man/man2html. S použítím známého přepisovače se to na první pohled zdá být triviální, ale není. Man2html totiž nemá žádné konfigurační soubory a odkazy jsou natvrdo zákódované ve skriptech i binárkách, takže po prvním kliknutí je uživatel zpátky na původní adrese.

V této situaci se hodí další modul Apache – ext_filter. Ten nám umožní upravit stránku těsně před tím, než je odeslána klientovi. Úpravu adres z původního /cgi-bin/man/ na hezčí /man/ provedeme příkazem sed. Apachí konfigurace pak může vypadat následovně:

ExtFilterDefine purge_cgi_bin mode=output \
cmd="/bin/sed s/\\/cgi-bin\\/man/\\/man/g"

...

DocumentRoot /var/www/pagename/
<Directory /var/www/pagename/>
    RewriteEngine on
    RewriteRule ^man/(.*)$ /cgi-bin/man/$1 [QSA,L]
    ...
</Directory>

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory /usr/lib/cgi-bin/man>
    Options ExecCGI
    SetHandler cgi-script
    SetOutputFilter purge_cgi_bin
</Directory>

Pozor na dvojí lomítka v cmd="…" – řetězec je poprvé escapován již Apachem (nebo spíše daným modulem) a zdvojení je tak nutné, aby se zpětné lomítko dostalo až k programu sed. Zbytek je asi jasný :-)

Tato konfigurace samozřejmě není ideální, protože se při každém dotazu volají dva programy. To v případě neposlušného cgi programu může být jediným řešením, nechceme-li (nebo nemůžeme-li) daný program upravovat.

Update: Když na to teď koukám, tak je tu RewriteEngine trochu zbytečný, stačil by Alias nebo to rovnou zahrnout do ScriptAlias… Tuto úpravu již ponechám na bystrém čtenáři :-)

Komentáře

Žádné komentáře
Přidat komentář
Odpovídáte na komentář .
Vaše stránka. Nepovinné.
**tučné** //skloňené// ''kód''
* seznam pol. 1
* seznam pol. 2
  * vnořený seznam
# číslovaný seznam
{{{
předformátovaný text
}}}
[[http://devl.cz link]]