.htaccess(mod_rewrite)で日本語URLへリダイレクトさせる

  • このエントリーをはてなブックマークに追加

わたしが管理しているサイトで

abc.com/?p=hoge

のようなパラメータ付きのアクセスを

abc.com/ほげ/

のような日本語URLへリダイレクトさせる必要が生じた。

 
まず、htaccessでmod_rewriteを使うのが前提。

?p=hogeの部分は
%{REQUEST_URI} ではなく %{QUERY_STRING}
でとるので

とする。

リダイレクトさせる先が日本語URLでなくて、例えば

abc.com/hogehoge/

だった場合

とする。2行目に「$1?」を入れないとパラメータもついてきて
abc.com/hogehoge/?p=hoge
へとリダイレクトされてしまうので注意。

問題はここから。

日本語URL(abc.com/ほげ/)へリダイレクトしたいということ。

本来は、「ほげ」の部分をUTF-8でエンコードして

で動くはず。

しかし、実際やってみると

abc.com/%25e31%25bb%25e312/ へとリダイレクトされ、404となってしまう。

ネットでいろいろ調べてみると、引数にNo Escapeを意味する[NE]を指定すると、書き換え結果に対して通常行なわれるURLエスケープルールを適用しないようにでき、出力の中にパーセント文字が使えるとのこと。

しかし、上のように[NE]をつけて試してみると、

abc.com/%e31%bb%e312/ へとリダイレクトされ、これまた404。

ここで、%の部分をエスケープしてみるといいのではないかと考え、上のようにしてみると、

無事 abc.com/ほげ/ へリダイレクト。

エスケイプしたうえで、ノーエスケープするというトリッキーな解決策ではあるが、なんとかうまくいってホッとした。

≪追記≫
WordPressを入れているサイトだと、プラグインでRedirectionを入れて、リダイレクト設定をしたほうが楽。クリックされた回数もわかるしね。ただ、htaccessでもいろんな設定をして、Redirectionでもすると時間が経ってからよくわからなくなりそうな気もしている。


サブコンテンツ