RewriteRuleとCGI

CGIの呼び出しをRewriteRuleで書き換えるときは、以下の点に注意する必要がある。

  • RewriteRuleディレクティブで指定するマッチパターンの対象となるものは、CGIへのパラメータを含んだREQUEST_URIではなく、CGIファイルパスのみのSCRIPT_NAME(または、SCRIPT_URL)である。
  • CGIへのパラメータを照合する場合は、RewriteCondディレクティブでQUERY_STRINGのマッチングを行う。

REQUEST_URI、SCRIPT_NAME、SCRIPT_URL、QUERY_STRING環境変数のこと。

# 設定例)
#     http://server/test.cgi?hoge=1&fuge=hello を
#     http://server/sample/test.cgi?hoge=1&fuge=hello に書き換え

RewriteEngine on
RewriteCond %{QUERY_STRING} (^|&)hoge=1(&|$)
RewriteCond %{QUERY_STRING} (^|&)fuge=hello(&|$)
RewrieRule ^/test\.cgi$ /sample/test.cgi


Apache mod_rewrite」の日本語ドキュメントはこちらを参照。
ちなみに、Apache 1.3のmod_rewriteは"configure --enable-shared=max"としてもビルドされないので、以下の手順で手動インストールする必要がある。

  1. "cd <Apacheソースディレクトリ>/src/modules/standard/"と実行して、カレントディレクトリを移動する。
  2. "make mod_rewrite.so"と実行して、mod_rewrite.soをビルドする。
  3. ndbm.hが無い旨のエラーが発生した場合:
    1. mod_rewrite.hの"#ifndef NO_DBM_REWRITEMAP"の前の行に"#define NO_DBM_REWRITEMAP"と記述する。
    2. 再度"make mod_rewrite.so"を実行する。
  4. "sudo cp mod_rewrite.so <Apacheインストールディレクトリ>/libexec"と実行して、mod_rewrite.soをにコピーする。
  5. "<Apacheインストールディレクトリ>/httpd.conf"に以下の行を追加する。
    1. LoadModule rewrite_module libexec/mod_rewrite.so
    2. AddModule mod_rewrite.c