わたしが管理しているサイトで
abc.com/?p=hoge
のようなパラメータ付きのアクセスを
abc.com/ほげ/
のような日本語URLへリダイレクトさせる必要が生じた。
まず、htaccessでmod_rewriteを使うのが前提。
?p=hogeの部分は
%{REQUEST_URI} ではなく %{QUERY_STRING}
でとるので
[php]RewriteCond %{QUERY_STRING} ^p=hoge[/php]
とする。
[adsense]
リダイレクトさせる先が日本語URLでなくて、例えば
abc.com/hogehoge/
だった場合
[php]RewriteCond %{QUERY_STRING} ^p=hoge
RewriteRule ^(.*)$ /hogehoge/$1? [R=301,L][/php]
とする。2行目に「$1?」を入れないとパラメータもついてきて
abc.com/hogehoge/?p=hoge
へとリダイレクトされてしまうので注意。
問題はここから。
日本語URL(abc.com/ほげ/)へリダイレクトしたいということ。
本来は、「ほげ」の部分をUTF-8でエンコードして
[php]RewriteCond %{QUERY_STRING} ^p=hoge
RewriteRule ^(.*)$ /%e3%81%bb%e3%81%92/$1? [R=301,L][/php]
で動くはず。
しかし、実際やってみると
abc.com/%25e31%25bb%25e312/ へとリダイレクトされ、404となってしまう。
ネットでいろいろ調べてみると、引数にNo Escapeを意味する[NE]を指定すると、書き換え結果に対して通常行なわれるURLエスケープルールを適用しないようにでき、出力の中にパーセント文字が使えるとのこと。
[php]RewriteCond %{QUERY_STRING} ^p=hoge
RewriteRule ^(.*)$ /%e3%81%bb%e3%81%92/$1? [NE,R=301,L][/php]
しかし、上のように[NE]をつけて試してみると、
abc.com/%e31%bb%e312/ へとリダイレクトされ、これまた404。
[php]RewriteCond %{QUERY_STRING} ^p=hoge
RewriteRule ^(.*)$ /\%e3\%81\%bb\%e3\%81\%92/$1? [NE,R=301,L][/php]
ここで、%の部分をエスケープしてみるといいのではないかと考え、上のようにしてみると、
無事 abc.com/ほげ/ へリダイレクト。
エスケイプしたうえで、ノーエスケープするというトリッキーな解決策ではあるが、なんとかうまくいってホッとした。
≪追記≫
WordPressを入れているサイトだと、プラグインでRedirectionを入れて、リダイレクト設定をしたほうが楽。クリックされた回数もわかるしね。ただ、htaccessでもいろんな設定をして、Redirectionでもすると時間が経ってからよくわからなくなりそうな気もしている。