mod_rewrite モジュールを使ってみる

Apache へのアクセスをフックして、かなり強力な操作ができる mod_rewrite モジュール。これまでシコシコとアプリケーション側で対応していたものが、サクっとWebサーバが解決してくれる可能性大ですよ、これ。

豊富な機能をざっとながめて思いつくサービスとしては、httpアクセスのSSLへのリダイレクト、サブドメイン管理、リファラ判定などによるコメントスパム対策、ブラウザ判定や時刻によるリダイレクト。ブラウザ判定をうまく使えば、例えばフルフラッシュサイトで、検索エンジンのクローラにだけ別HTMLページを見せてSEO対策することもできそう。(そういう小賢しい対応は好きじゃないけど)

以下、大まかな機能と使い方のメモ。

apache2.0系でのサンプルなので、1.3系の人は読み替えたり、調べたりしてうまいことやってくださいまし。

# vi /usr/local/apache/conf/httpd.conf

LoadModule rewrite_module modules/mod_rewrite.so RewriteEngine on
# サーバへのアクセスを新ドメイン newdomain にリダイレクト RewriteRule ^/(.*) http://newdomain/$1

VirtualHost を使っている場合は、設定している VirtualHost ごとに Rewrite の設定をしてあげる必要がある。たとえば、以下のような感じで。

# vi /usr/local/apache/conf/httpd.conf

LoadModule rewrite_module modules/mod_rewrite.so
<VirtualHost www.hoge.com> DocumentRoot /www/docs/hoge.com ServerName www.hoge.com RewriteEngine on RewriteRule ^/(.*) http://hoge.newdomain/$1 </VirtualHost> <VirtualHost www.moge.net> DocumentRoot /www/docs/hoge.com ServerName www.moge.net RewriteEngine on RewriteRule ^/(.*) http://moge.newdomain/$1 </VirtualHost>

使用できる主な設定ディレクティブを簡単にまとめ。

ディレクティブ概要
RewriteEngine実行時の書き換えエンジン On/Off の切り替え (デフォルトは Off)
RewriteLog書き換え動作のログを出力するファイル名の設定
RewriteLogLevelログの出力レベル。数字が大きいほど詳細。デフォルトは 0 で、推奨値も 0
RewriteBase書き換え時にベースとなるURLの指定
RewriteRule第1引数に指定した正規表現パターンのマッチ内容を、第2引数の内容に書き換え
RewriteCondRewriteRule 実行の条件を指定可能
RewriteMapRewriteCond または RewriteRule の第1引数を動的に設定するためのマッピング指定

RewriteCond は複合条件にも対応していて、複数条件を続けて書くことで AND条件に、 [OR]でつなげれば OR条件になる。また、条件文には HTTP_USER_AGENT や HTTP_REFERRER などの環境変数が使用できる。素晴らしいの一言。

やれることが多すぎるので、少し取っつきにくいけれども、使ってみると意外とアッサリ。むしろ何でもできそうな雰囲気に飲まれて、珍妙な発想しないことの方が、よほど難しい気がする。

最後に、携帯キャリアごとにページを振り分ける簡易版サンプル。[L] はそれ以降の条件を判定せずに終了させるオプション。(switch文の break みたいなもん)

RewriteEngine on

RewriteCond %{HTTP_USER_AGENT} DoCoMo RewriteRule ^/$ docomo/index.html [L]
RewriteCond %{HTTP_USER_AGENT} J-PHONE [OR] RewriteCond %{HTTP_USER_AGENT} Vodafone RewriteRule ^/$ vodafone/index.html [L]
RewriteCond %{HTTP_USER_AGENT} KDDI [OR] RewriteCond %{HTTP_USER_AGENT} UP\.Browser RewriteRule ^/$ au/index.html [L]

いまVodafoneのユーザエージェント情報を見たら、J-PHONE も Vodafone も含まれていない機種が出ているじゃないか。判定ルールどうすんだろ、これ。

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/291
κατασκευη eshop at 2013年9月21日 05:46

Good web site! I really love how it is easy on my eyes and the data are well written. I am wondering how I might be notified whenever a new post has been made. I've subscribed to your RSS which must do the trick! Have a great day!

κατασκευη ιστοσελιδων at 2014年10月12日 06:37

My business is definitely prompted with all your composing abilities plus with all the formatting to your weblog. Are these claims your paid subject matter and also have you alter this on your own? In any event . keep inside the good quality publishing, it is strange to check an incredible site such as this one now.