mod_rewrite でクエリーが2重にエンコードされるのを避ける


日本語をエスケープしたクエリー付きの URL を Apache の mod_rewirte でリライトする時、クエリーが2重にパーセントエンコード(URLエンコード)されるのを避ける方法。

https サイトへのアクセスはサーバに負担を掛けるのでなるべく減らしたい。このため、暗号化通信が不要な場所は http 側にリダイレクトする。この設定は下記の通り。

https 側の VirtualHost の設定

RewriteRule ^/((public1|public2)/.*)$ http://www.example.com/$1 [R=301,L]

mod_rewrite はクエリー文字列(QUERY_STRING)を残して転送してくれるが、転送の際に、パーセントエンコード)された文字列をさらにパーセントエンコードしてしまう。このため、「検索ページ」などへの クエリー付 GET アクセスを転送しようと思っても、上の設定では2重にパーセントエンコードされて転送先のページが機能しない。

クエリー文字列のパーセントエンコードを避ける mod_rewrite の設定

パーセントエンコードをせずにクエリー付 URL を転送する設定は下記の通り。NE オプションを付ける。

RewriteRule ^/(search/.*)$ http://www.example.com/$1 [R=301,NE,L]