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

第14回知っておきたいApacheの基礎知識 その10

さて、前回はmod_rewriteの基本的な動作を説明しました。mod_rewriteができることの概念は理解できているかと思います。今回は、より実践的なmod_rewriteの使い方に踏み込んでいきたいと思います。

CGIを有効にする

まずはmod_rewriteに取り掛かる前にやるべきことがあります。QueryStringで受け取った値を参照したりしたいため、アプリケーションを稼働させる環境を作りましょう。

今回はmod_cgiを利用して、perlで設定してみようと思います。

それでは現在使用しているVirtualHost内にCGIの設定を追加しましょう。

下記の設定を追加してください。

<VirtualHost *:80>
    DocumentRoot /usr/local/apache2/vhosts/www.example.com/htdocs
    ServerName www.example.com
    ErrorLog /usr/local/apache2/vhosts/www.example.com/logs/error_log
    CustomLog /usr/local/apache2/vhosts/www.example.com/logs/access_log common

    ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"  ## 追加

    RewriteEngine on
    RewriteLogLevel 9
    RewriteLog  /tmp/rewrite.log
    RewriteRule /index.html /foo/bar/sample.html
</VirtualHost>

これで/usr/local/apache2/cgi-bin/配下のファイル実行することが可能となりました。それでは引き続き、確認用のプログラムの配置を行いましょう。

以下のファイルパスに確認用のプログラムを設置してください。

Path : /usr/local/apache2/cgi-bin/index.pl

内容は、QueryStringで受け取ったパラメーターの値を表示するだけのシンプルなスクリプトです。

上記のパスにファイルを設置したら実行権限を追加して、Apacheを再起動後ブラウザからアクセスしてください。

  • http://servername/cgi-bin/index.pl?id=foo&name=bar

図1のように表示されればCGIの設置完了です。

図1 サンプルの実行画面
図1 サンプルの実行画面

mod_rewriteでつくる簡潔なURL

さて、URLの中に?が入っているとSEO的に不利なことは前回簡単に説明いたしました。しかしながら、先ほどのサンプルのURLには?が含まれたURLになっています。まずはこれを書き換えるようにしてみましょう。

以下の通りに書き換えます。

書き換え前
http://servername/cgi-bin/index.pl/foo/bar
書き換え後
http://servername/cgi-bin/index.pl?id=foo&name=bar

それでは、上記のパターンを可能にするmod_rewriteの設定を行っていきましょう。下記の設定ファイルを見てください。

<VirtualHost *:80>
    DocumentRoot /usr/local/apache2/vhosts/www.example.com/htdocs
    ServerName www.example.com
    ErrorLog /usr/local/apache2/vhosts/www.example.com/logs/error_log
    CustomLog /usr/local/apache2/vhosts/www.example.com/logs/access_log common

    ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"

    RewriteEngine on
    RewriteLogLevel 9
    RewriteLog  /tmp/rewrite.log
    RewriteRule  ^/cgi-bin/index\.pl/([0-9a-z]+)/([0-9a-z]+)$   /cgi-bin/index\.pl?id=$1&name=$2 [PT]  ## 追加
</VirtualHost>

RewriteRuleが追加されていることが確認できましたか?Apacheを再起動後、以下のURLにアクセスしてみてください。

  • http://servername/cgi-bin/index.pl/foo/bar

図1と同じものが表示されれば成功です。

RewriteRuleの書き方

それではRewriteRuleの書き方を見ていきましょう。RewriteRuleの書式は以下の通りとなっています。

RewriteRule 書き換え前のURL 書き換え後のURL [オプション]

上記のルールをサンプルの設定ファイルに当てはめてみると以下のようになります。

書き換え前のURL
^/cgi-bin/index\.pl/([0-9a-z]+)/([0-9a-z]+)$
書き換え後のURL
/cgi-bin/index\.pl?id=$1&name=$2

正規表現に慣れていないとちょっとつらいかもしれません。ここでポイントとなるのは、書き換え前のURLの()でくくられた部分と、書き換え後のURLの$1、$2です。

これは後方参照とよばれるテクニックで、()でくくられた部分を書き換え後のURL内で"$1,$2" と順番に参照しています。

mod_rewriteを使う上で、必須のテクニックなのでこれを機会にマスターしておきましょう。

RewriteRuleのオプション

それでは、最後にオプションをみていきましょう。

上記の例では[PT]と設定しています。実は、これによって/cgi-binの下に設置してあるスクリプトへ値を受け渡すことができるようになっています。

これは、PT(passthrough)と呼ばれる機能で、ScriptAliasなどで設定しているディレクティブへ処理をわたしたいときに利用します。その他に、mod_jkを利用してアプリケーションサーバへ処理を渡している時などにも有効です。

ただし、指定してあるドキュメントルート内だけでrewriteさせる場合はこのオプションは不要なので注意してください。

[TIPS] RewriteLogでrewriteの内容を参照する

いろいろとrewriteを設定してきましたがアプリケーションの構造によってはもっと設定が複雑になることもしばしば。予想以上にrewriteの設定にハマってしまうこともあるでしょう。そんなときは、rewritelogを見てみましょう。今回のサンプルでも、Logを出す設定を入れています。

下記の2行の部分です。

RewriteLogLevel 9
RewriteLog  /tmp/rewrite.log

rewriteの設定中はLogLevelを最高レベルの9に指定しておくのがよいでしょう。どこまでマッチしたのか、という情報までLogとして出されるのでとても便利です。しかし、このままだとLogの量が膨大になってしまうのでサービスとして利用する場合は設定を外すように注意してくださいね。

最後に

さて、今回は前回より実践的なmod_rewriteの設定方法について紹介をしました。この知識があれば、ある程度柔軟な設定に対応することも可能でしょう。しかし、mod_rewriteにはまだまだいろいろな機能が実装されています。次回は応用的な使い方について紹介をしていきたいと思います。

おすすめ記事

記事・ニュース一覧