ApacheのRewriteRuleで遷移先に日本語文字列を含むURLを指定する

さんざんはまったのでメモ。

例えば、/hogeをhttp://hoge.comに飛ばしたい場合は、

RewriteRule ^/hoge http://hoge.com [NE,R=301,L]

とかすると思うんですよ。

ここで、http://ほげ.comに飛ばしたい場合はどうするか。

まあ普通に考えてURLエスケープしますよね。パーセントを使うわけです。

RewriteRule ^/hoge http://%E3%81%BB%E3%81%92.com [NE,R=301,L]

これで完璧だと思ったら、どうも世の中うまくいかない。

実際にこれを動かすと、何故か

http://%E31%BB%E312.com

に飛ばされる。

なにゆえ!!!

結論から言うと、RewriteCondを使う場合に、パーセントはRewriteCondの正規表現で()指定した部分を%[数字]で置き換える指令になっちゃうんです。

なので、%[数字]の部分は全てエスケープしなければいけません。

エスケープ文字は\です。

つまり正しくは

RewriteRule ^/hoge http://%E3\%81%BB%E3\%81\%92.com [NE,R=301,L]

とするべきです。

ここで間違って%E3とかまで\%E3とやってしまうとまたおかしな事になるので注意が必要です。

“RewriteRule パーセント”でぐぐっても全くヒットしなかったので、ここにしたためるものである。