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

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

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

rewrite_mapでURLのマッピングを行う

URLの書き換えを行う際,独自のマッピング情報によって書き換えを行いたい場合はあることでしょう。URL上では意味のある文字列を使用したいが,アプリケーションのデータ上はID管理をされているようなケースです。

いままでのテクニックで実装するなら,RewriteRuleで実現することが可能です。ただし,マッピング情報が変更されるたびにhttpd.confを修正したりapacheの再起動がはいることは現実的ではありません。

そこでrewrite_mapという機能を使うことでrewrite_ruleの適用時に書き換えのマッピング情報を与えることができます図1)⁠

図1 rewrite_mapによるマッピング例

図1 rewrite_mapによるマッピング例

それでは設定ファイルを見ていきましょう。なお,確認用に前回使用したCGIを使いますので準備しておいてください。

<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
    RewriteMap mapping txt:/usr/local/apache2/conf/mapping.txt
    RewriteRule ^/(.*)$ /cgi-bin/index.pl?id=${mapping:$1} [PT]

</VirtualHost>

さらにマッピング情報を管理するためのファイルが必要になりますので,作成します。

$ sudo tee /usr/local/apache2/conf/mapping.txt << EOF
SiteA 1
SiteB 2
SiteC 3
EOF

それでは,アクセスしてみましょう。

http://{$servername}/SiteA でアクセスし,id --> 1 と表示されれば成功です!

RewriteMapディレクティブの記述方法

RewriteMap,RewriteRuleのディレクティブにそれぞれ注目してください。RewriteMapディレクティブがとることのできる引数は以下です。

RewriteMap  マッピング名 マッピングファイル(テキスト,DBM形式が選択可能)

RewriteMapディレクティブでマッピング名を指定したら,RewriteRuleディレクティブではそのマッピング名を使って呼び出しましょう。${マッピング名:キー} という形式でキーに対応する値を取得することができます。

サンプルで用意した設定ファイルのように,書き換え後のURLで利用することで,有効活用することができます。

なお,マッピングファイルにはテキスト形式とDBM形式を選択することができます。今回はtxt形式で利用をしていますがDBM形式で利用したい場合も,httxt2dbmという変換用のツールがapacheに同梱されているので簡単に使用することができます。

最後に

さて,全3回にわたり,mod_rewriteについて説明をしてきました。ここで紹介したmod_rewriteの利用方法はまだまだ一部で,工夫次第ではより様々な処理を担当させることができます。しかし,mod_rewriteは便利すぎるため使いすぎには注意してください。 気がつけば誰も触ることができないような設定ファイルができあがってしまうようなこともしばしばあります。ご利用は計画的に。

著者プロフィール

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

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