CGI: url-encode : mod_rewrite

CleanでCGIを作っているのだけれど、あるURLを入力すると、400 Bad Requestになってしまって接続できないという現象がおきて困っている。
どうも、mod_rewriteを経由するとおこる現象のようで、書き換え後のURLを直接入力すると、エラーはおこらない。
問題が起きるURLは次のようなもの。

http://localhost:8080/view/aa%25a/
http://localhost:8080/view/aa%25&aa/

次のは起きない。

http://localhost:8080/view/aa%25aa/

非常に微妙な状況である。
いろいろ探していて、関連しそうな記事を見かけたのでリンクしておく。
http://www.issociate.de/board/post/274279/mod_rewrite:__20_-%3E_space_-%3E_400_Bad_Request.html

      • -

もしやと思って試してみたら、やはり、次のURLは失敗した。

http://localhost:8080/view/aa%25zz/

どうも、mod_rewriteを通ると、'%25??'が'%??'に変化して解釈されるよう。
上のURLを見るに、

RewriteMap escape int:escape
RewriteRule ^/user/(.*)/search/(.*)$
/simpy/User.do?username=${escape:$1}&q=${escape:$2} [L]

という書き方が有効なようなので試してみる。

      • -

上のでOKでした。
ただし、RewriteMapは、directoryタグの中には書けなくて、

RewriteMap escape int:escape

<Directory "...">
  RewriteEngine on
  RewriteRule ^(.*)/$ /cgi-bin/Controller/${escape:$1}/ [L]
</Directory>

と書いてあげる必要がありました。