日本語をエスケープしたクエリー付きの 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]