mod_rewriteで日本語を含むアドレスを処理するためのメモ
2020/11/29 更新
mod_rewriteでURIの書き換え等を行うとき、対象がすべて英数字で構成されていれば特に気にすることなく処理を実行できます。しかし、日本語が含まれているとうまく処理できないことがあるため、この場合の対処方法をメモしておきます。
リダイレクト元に日本語を含む場合
うまくいかない例
例えば、「http://example.com/foo/ほげほげ/」に対してリダイレクト処理を行うことを想定します。
このとき、次のように記述するとエラーとなります。
RewriteRule ^foo/ほげほげ/$ http://example.com/bar/hogehoge/ [R=301,L]
RewriteRule ^foo/%e3%81%bb%e3%81%92%e3%81%bb%e3%81%92/$ http://example.com/bar/hogehoge/ [R=301,L]
解決方法
mod_rewrite用に少し変わったエンコードをする必要があります。
具体的にはまず日本語をURLエンコードした形から、「%」を「\x」に変換したものを使用する必要があります。
RewriteRule ^foo/\xe3\x81\xbb\xe3\x81\x92\xe3\x81\xbb\xe3\x81\x92/$ http://example.com/bar/hogehoge/ [R=301,L]
これで日本語が含まれていても正しく処理できるようになります。
参考:Apacheのmod_rewriteで日本語にマッチさせたい(引用) | ええかげんブログ(本店)
リダイレクト先にも日本語が含まれる場合
ここまではリダイレクト元のみが日本語URIだった場合についての例でした。
しかし、リダイレクト先にも日本語が含まれる場合、さらに処理が必要です。
具体的には、リダイレクト元の処理は先ほどの例のまま、リダイレクト先のURIをURLエンコードし、「%」の前に「\」をつける(=「\%」)必要があります。
また、エスケープしないように「NE」を加えます。
RewriteRule ^foo/\xe3\x81\xbb\xe3\x81\x92\xe3\x81\xbb\xe3\x81\x92/$ http://example.com/bar/\%e3\%81\%bb\%e3\%81\%92\%e3\%81\%bb\%e3\%81\%92/ [NE,R=301,L]
これで正しくリダイレクト元・先の両方に日本語を含んでいても転送できるようになります。
なお、リダイレクト先のみ日本語を含んでいる場合であれば、元は通常通りで先のみこちらの例のようにすれば対応できます。