こんにちは、Webプログラマの篠田です。
明日は年末恒例の自宅大掃除を計画しています。
1年間の汚れを落とすべく、窓や換気扇など普段掃除しないところを徹底的に磨こうと思います!
2017年最後のブログは、.htaccessによる日本語を含むリダイレクト設定に関してご紹介します。
日本語を含むURLとは
一番、遭遇率が高いのはWordPressを利用しているサイトのパーマリンク(記事の詳細URLのこと)に含まれた状態で、公開されている場合かとおもいます。
URLに日本語が含まれていても、Webサイトの表示には問題ありません。
ですが、Webページのパーマリンクを変更したり、ドメインが変更になるなどの「リダイレクト(転送)」が必要になった場合に困ったことになります。
一般的な方法で、日本語を含むURLをリダイレクトしてみる
例として、架空のURL「https://alaki.co.jp/テスト」から「https://alaki.co.jp/test.html」にリダイレクトするパターンを検証します。
.htaccessを利用した、一般的なリダイレクト設定は下記のとおりです。
1 2 3 4 5 6 |
<IfModule mod_rewrite.c> RewriteEngine On #一般的な記述方法でのリダイレクト設定 RewriteRule ^%E3%83%86%E3%82%B9%E3%83%88 https://alaki.co.jp/test.html [R=301,L] </IfModule> |
日本語を含むURLは、「URLエンコーディング」という特殊な表記に自動的にブラウザが変換して表示してくれます。
「URLエンコーディング」された文字列を、.htaccessに記述します。
URLに含まれている日本語「テスト」は、「URLエンコーディング」されると「%E3%83%86%E3%82%B9%E3%83%88」と表現されます。
次に、リダイレクト先は「https://alaki.co.jp/test.html」とします。
この設定の結果はというと「リダイレクト失敗」となります。
リダイレクトされない原因
Apacheを利用している場合、「URLエンコーディング」された文字「%」を「x」に自動的に変換してしまうという特徴があります。
そのため「%E3%83%86%E3%82%B9%E3%83%88」が本来の意味を失ってしまうため、リダイレクトができないという現象が発生します。
解決方法
「URLエンコーディング」は文字を「%」と16進数2桁の文字コードで作られているので、Apacheが認識できる「16進数」にすることで対応ができます。
具体的には「%」の部分を「\x」に置き換えることで、Apacheが正常に「URLエンコーディング」された文字列を認識するようになります。
例えば「%E3」であれば「\xE3」となります。
これを踏まえて、リダイレクト処理を書き換えていきます。
1 2 3 4 5 6 |
<IfModule mod_rewrite.c> RewriteEngine On #「%」を「\x」に置き換えたパターン RewriteRule ^\xE3\x83\x86\xE3\x82\xB9\xE3\x83\x88 https://alaki.co.jp/test.html [R=301,L] </IfModule> |
これであれば、正常に「https://alaki.co.jp/test.html」にリダイレクトされるようになります。
日本語を含むURLにリダイレクトしたい場合
日本語を含むURLのリダイレクトには、もう1つ大きな罠があります。
それが、リダイレクト先のURLに日本語が含まれている場合です。
例えば「https://alaki.co.jp/test.html」を「https://alaki.co.jp/テスト」にリダイレクトしたい場合です。
先程のパターンを利用して書いてみます。
1 2 3 4 5 6 |
<IfModule mod_rewrite.c> RewriteEngine On #「日本語を含むURL」にリダイレクトさせたいパターン RewriteRule ^test.html https://alaki.co.jp/\xE3\x83\x86\xE3\x82\xB9\xE3\x83\x88 [R=301,L] </IfModule> |
この設定の結果はというと「リダイレクト失敗」となります。
リダイレクトされない原因
先程は、Apacheが「%」を理解できなかったことが原因でしたが、今度は「mod_rewrite」の方に問題が発生したためです。
「mod_rewrite」は「\(バックスラッシュ)」を無視してしまい「https://alaki.co.jp/xE3x83x86xE3x82xB9xE3x83x88」にリダイレクトされてしまいます。
また、「%E3%83%86%E3%82%B9%E3%83%88」だと今度は「mod_rewrite」が「%」を置換文字列とご認識して正しくリダイレクトできなくなります。
解決方法
「mod_rewrite」の「%」を理解させるには「%」を「\%」に変換して、「置換処理」を無効化することで解決することができます。
具体的な.htaccessの設定は下記のとおりです。
1 2 3 4 5 6 |
<IfModule mod_rewrite.c> RewriteEngine On #「日本語を含むURL」にリダイレクトさせたいパターン(正解) RewriteRule ^test.html https://alaki.co.jp/\%E3\%83\%86\%E3\%82\%B9\%E3\%83\%88 [NE,R=301,L] </IfModule> |
「NE」は「mod_rewrite」のフラグで、特殊文字を「エンコード」されるのを防ぐという設定になります。
これで、日本語を含むURLにリダイレクトすることが可能になります。
まとめ
日本語を含むURLは、避けられるのであれば避けたほうが良い言われていますが、どうしても日本語を含むURLになってしまう場合もあるとおもいます。
そういう不測の事態+リダイレクトでも対策さえ知っていれば、恐れる心配はありませんね。
それでは、2018年もよろしくお願いします。
みなさま、良いお年を!!
現場の業務フローに寄り添ったWebシステムをお求めなら、私たちALAKIにご相談ください。
ALAKIは経営者様が感じている問題点と、実際にWebシステムを利用される現場スタッフ様が直面している課題を、弊社システムエンジニアが丁寧に聞き取り、お客様と共にシステムを作り上げていきます。
業務改善が実現できるWebシステムをお求めの方は、是非ALAKIにご相談ください。