UNIX的なアレ:gihyo.jp出張所

第15回 知っておきたいApacheの基礎知識 その11

この記事を読むのに必要な時間:およそ 2 分

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 fireflxI am Internet Explorerと表示されれば成功です。これはUserAgentを見てそれぞれ適用させるRewriteRuleを変えている例です。

さて,それではディレクティブを詳しく見ていきましょう。

まずはRewriteCondという部分に注目してください。RewriteCondはif文のようなもので,以降につづくRewriteRuleを適用するかどうかを判定するためのものです。 構文としては以下のとおりです。

RewriteCond 判定の対象 判定パターン [オプション]

上記の例を当てはめますと,UserAgentの情報を環境変数からとってきて,FirefoxやIEにマッチさせています。その結果,それぞれ当てはめているRewriteRuleを分岐させ,書き換え先のHTMLファイルを変更しています。

その他にもApacheで使うことのできる環境変数は,cgi-binの配下にあるprintenvというCGIを実行することで確認できます。

なお,このprintenvを使う際は,実行権限を設定することとPerlのpathがあっているかどうかを注意してください。

著者プロフィール

和田修一(わだしゅういち)

株式会社ロケットスタートCTO。PHPやPerlを中心としたアプリケーション開発から,Linuxなどの技術を中心としたインフラ系の設計・構築を担当。個人Blogは「Unix的なアレ」。

コメント

コメントの記入