.htaccess で日本語URLへリダイレクトする際の注意点

  • Apache

日本語を含むURLのリダイレクトは、サーバーによってはそのまま記述しても上手くいくことがありますが、ダメだった時の対処法を紹介します。

例)/hoge/index.html から /hoge/サンプルページ/ へリダイレクトしたい

普通に書くと下記のようになりますが、リダイレクト先が日本語ページのため正しく動作しません。一つずつ手順を追っていきます。

RewriteRule ^hoge/index.html$ http://{%HTTP_HOST}/サンプルページ/ [R=301,L]

日本語をエスケープ & [NE]オプションを追加する

まず日本語の文字列をエスケープします。「%英数字」のようなヒトには読めないような形ですね。日本語のエスケープについてはウェブサービスがググれば出てくると思います。一応、ディベロッパーツールを開いてencodeURI()関数を使ってもすぐにできます。decodeURI()でもとに戻せます。

エスケープ後は下記のような形になるはずです。

RewriteRule ^hoge/index.html$ http://{%HTTP_HOST}/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8/ [NE,R=301,L]

%をエスケープする

次に「%」の文字の前に「\(環境によっては円マーク)」を付けます。一個一個つけるのは骨が折れるので、テキストエディタなどで全置換しましょう。

RewriteRule ^hoge/index.html$ http://{%HTTP_HOST}/\%E3\%82\%B5\%E3\%83\%B3\%E3\%83\%97\%E3\%83\%AB\%E3\%83\%9A\%E3\%83\%BC\%E3\%82\%B8/ [NE,R=301,L]

こちらで正しくリダイレクトできるはずです。

解説

なぜNEオプションが必要なのか?

RewriteRule ^hoge/index.html$ http://{%HTTP_HOST}/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8/ [R=301,L]

NEオプションが無い場合、「%」という文字が自動的にエスケープされてしまい「%25」に変換された状態でリダイレクトされてしまいます。

http://{%HTTP_HOST}%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8/

↓ 「%」が「%25」にエンコードされたものが出力されURLが変わる

http://{%HTTP_HOST}/%25E3%2582%25B5%25E3%2583%25B3%25E3%2583%2597%25E3%2583%25AB%25E3%2583%259A%25E3%2583%25BC%25E3%2582%25B8/

%25だらけになってしまいました。
これでは本来存在しないURLに飛ばされてしまいます。そのため、エスケープを中止するために[NE](No Escape)オプションを使います。

なぜ日本語をエスケープ & NEオプションを追加しただけではダメなのか?

URLに「%1~%9」のいずれかが含まれていることが原因です。
%1~%9は「後方参照」と呼ばれ、リダイレクト先のURLにこの文字列が含まれていると、意図しない文字に変換されてしまいます(後方参照については正規表現について調べてみてください)。

そのため、「%」の前に「\」(円マーク。環境によってはバックスラッシュ)を付けて全てエスケープする必要があるのです。