Apache: totální přepis adresy
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 :-)