mod_rewriteの記事ももう3回目になります。なかなか慣れるまではクセのあるモジュールですが,非常に便利なモジュールであることは認識していただけているかと思います。
さて,前回では正規表現を利用したURLの書き換えを実践してきました。今回はよりmod_rewriteを使いこなしていきましょう。
rewrite_ruleの適用条件を指定する
1つのURL書き換えを行うときはあまり気になりませんが,複数のアプリケーションをハンドリングしようとなってくると条件を指定したくなるものです。そこで,RewriteCondというディレクティブを使用しましょう。「○○という条件のときは,RewriteRuleを適用する」といったif文のような記述をすることができます。
それではhttpd.confのVirtualHostの内容を以下のものに変更をしてみましょう。
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/htdocs
ServerName www.example.com
ErrorLog /usr/local/apache2/error_log
CustomLog /usr/local/apache2/access_log combined
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
RewriteEngine on
RewriteLogLevel 9
RewriteLog /tmp/rewrite.log
RewriteCond %{HTTP_USER_AGENT} Firefox
RewriteRule ^/$ /firefox.html [L]
RewriteCond %{HTTP_USER_AGENT} MSIE
RewriteRule ^/$ /ie.html [L]
</VirtualHost>
さて,上記の設定ができましたらDocumentRootにファイルを設置しましょう。
$ echo "I am firefox" | sudo tee /usr/local/apache2/htdocs/firefox.html
$ echo "I am Internet Explorer" | sudo tee /usr/local/apache2/htdocs/ie.html
ファイルが設置できたら,Firefox,Internet Explolerでそれぞれアクセスしてみてください。それぞれのブラウザで,“I am fireflx”“I am Internet Explorer”と表示されれば成功です。これはUserAgentを見てそれぞれ適用させるRewriteRuleを変えている例です。
さて,それではディレクティブを詳しく見ていきましょう。
まずはRewriteCondという部分に注目してください。RewriteCondはif文のようなもので,以降につづくRewriteRuleを適用するかどうかを判定するためのものです。 構文としては以下のとおりです。
RewriteCond 判定の対象 判定パターン [オプション]
上記の例を当てはめますと,UserAgentの情報を環境変数からとってきて,FirefoxやIEにマッチさせています。その結果,それぞれ当てはめているRewriteRuleを分岐させ,書き換え先のHTMLファイルを変更しています。
その他にもApacheで使うことのできる環境変数は,cgi-binの配下にあるprintenvというCGIを実行することで確認できます。
なお,このprintenvを使う際は,実行権限を設定することとPerlのpathがあっているかどうかを注意してください。

