Hlavní navigace

Speciální znaky v URL při použití mod_rewrite

2. 2. 2009 15:18 (aktualizováno) | Martin Jonáš

Tohle je další z problémů nad jejichž řešením jsme v poslední době strávili nějaký čas.

Pokud máme v URL hodnoty, které obsahuje speciální znaky (například ?, &, +, …) je nutné tyto hodnoty při sestavení URL escapovat nahradit je za ekvivalentní zápis pomocí %xx (viz RFC1738).

Problém nastal v případě, že jsme takovéto URL zpracovávali pomocí mod_rewrite (hezká URL kvůli SEO). Přestože jsme URL do HTML vygenerovali správně escapované do systému nám dorazilo opět se speciálními znaky. Nakonec jsme zjistili, že problémem je právě přepis pomocí mod_rewrite.

Mějme například následující jednoduché pravidlo:

RewriteRule ^/page/(.*)$ page.php?title=$1

Pokud přes takovéto pravidlo projde URL obsahující escapovanýspeciální znak výsledkem bude nové URL, ve které bude tento znak opět zapsaný přímo. Důvodem je, že pro účely rewriteRule provádí mod_rewrite automatické odescapování řetězců.

Po chvíli hledání na google jsme zjistili, že nejsme jediní, kdo měl tento problém. Viz například:

http://www.dracos.co.uk/code/apache-rewrite-problem/

http://tools.cherrypy.org/wi­ki/ModRewrite

Jako nejlepší možnost se nám jevilo zamozřejmně použít escapování pomocí RewriteMap. Podle návodů mělo stačit doplnit do httpd.conf:

 RewriteMap escape int:escape

A v .htaccess pak pouívat pravidla ve formátu:

 RewriteRule ^/page/(.*)$ page.php?title=${escape:$1}
Bohužel tento postup nefungoval. Hodnoty v URL byla stále překládány na hodnoty bez escapování. Nepodařilo se nám zjistit důvod. Pokud někdo máte nějaký nápad co by mohlo být příčinou tohoto chování budu rád pokud mi v příspěvcích pod článkem poradíte. Protože jediné řešení, které pro nás nakonec připadalo v úvahu bylo zakázání speciálních znaků v hodnotách se kterými je prováděn překlad pomocí mod_rewrite.