TIPS: Apache - mod_rewrite

多くのサイトでは伝統的にWebサイトのホスト名としてwwwを利用しています。 またそれと同時に、入力の手間,URLの文字数削減を考え、 wwwを付けないドメイン名だけのURLでのアクセスを提供するサイトも多くなっています。

弊社でも以前より、www.distraid.co.jpdistraid.co.jpでの同一Webサーバーへのアクセスが可能なようにDNSを設定してありますが、 サイト内リンクは基本的に相対パスで記述してありますので、ページのURLは最初にアクセスしたホスト名をそのまま継承し続けていました。

確かに複数のアクセス手段を提供するのはユーザーの利便性を向上させますが、1つのWebサイトに2つの名前での継続的なアクセスを許可するのは今後の混乱の元、あるいは非効率(SEO的にも)ですので、 強制的に指定のホスト名にリダイレクトさせます。


2007/08現在、distraid.co.jpのWebサイトはApache1.3.*上のバーチャルホストの1つとして運用されていますので、 Apacheのmoduleであるmod_rewriteを使い設定します。

まず、mod_rewriteが有効かどうかを確認する必要がありますが、 mod_rewriteのステータスはExtensionですので、特に変更していない場合は無効になっている可能性があります。 そこでhttpd.confを編集出来る環境ならば、

#LoadModule rewrite_module modules/mod_rewrite.so

をアンコメントし、Apacheを再起動すれば有効になります。 一般的なバーチャルホストの(サーバーの管理権限が無い)1ホストの立場では、上記の段階で無効になっている場合にはmod_rewriteの利用は出来ません。 また、バーチャルホストでは、.htaccessの利用が可能で、FileInfoのオーバーライドが許可されている必要もあります。

mod_rewriteは高機能ですが、その分記述も多少特殊なので動作検証用にデバッグログがあると非常に便利です。 そこで、httpd.confに下記のような記述を加え、ログメッセージを出力させます。

<IfModule rewrite_module>
  RewriteLog logs/rewrite.log
  RewriteLogLevel 5
</IfModule>

RewriteLogは出力するログファイル名を指定、RewriteLogLevelはログの出力レベル(0:ログ出力無し, 9以上:ほぼ全ての動作ログ出力)を設定します。 ログの出力では1リクエスト毎に1KBを越えるログを吐く事もあるので、実運用時にはログレベルを1にするか、0を指定して無効にした方が無難です。

バーチャルホスト(の1ホストの立場)ではログ取りは出来ませんので、ローカルのPCにApacheをインストールしてテストするのが良さそうです。

実際に利用している設定は下記のようになっています。

RewriteEngine on
RewriteCond %{HTTP_HOST} !^distraid\.co\.jp [NC]
RewriteRule . http://distraid.co.jp%{REQUEST_URI} [R=permanent,L]

distraid.co.jp以外でのアクセスについては、全てdistraid.co.jpにリダイレクトさせています。 URLのホスト部以外はリダイレクト先に引き継いでいる為、ユーザーはリダイレクトを意識する事無くサイトを利用出来ます。


今回は単純なリダイレクト処理だけですが、mod_rewriteではユーザーのブラウザ/ドメインを元にした高度な振り分け、 いかにも動的ページなURLを静的ページのURLのように見せる変換など、より複雑で面白く便利な処理が可能になっています。

詳しくは、
Apache 1.3 mod_rewrite [Doc Guide] / Apache 2.2 mod_rewrite [Doc Guide]
をご覧下さい。