web サーバ (Apache/2.0) の設定
≪ previous next ≫

U.6.CGI 関連ディレクティブ


 クライアントが入力したデータ (選択項目名、注文内容等) に応じてレスポンス (表示内容) が変化すれば、よりダイナミックな web が実現できる。
 サーバーが受信した要求データから、クライアントの入力データを取り出してスクリプト プログラム等に渡す仕組みを CGI (Common Gateway Interface) という。
CGI を使用可能にするためのディレクティブには次のようなものがある。

U.6.1.ScriptAlias

 URL を該当ディレクトリへマップし、CGI スクリプトとして実行可能にする。

ScriptAlias URL-path directory
  • default : /cgi-bin/ "/var/www/cgi-bin/"
  • URL-path
    CGI スクリプトへ導くキーとなるパスを記述する。
    (パスはスラッシュ (/) から書き始めること)
  • directory
    CGI スクリプトが存在するディレクトリへの絶対パスを指定する。
    ※ default の /var/www/cgi-bin/ は引用符で囲まれているが、引用符は省略可能。
  • サーバーはリクエスト URL 中に URL-path を検出すると、その部分を directory に変換してパスを再構成し、該当ディレクトリ内に存在する CGI スクリプトを実行させる。
  • 次のディレクティブが設定済みの時、
    ScriptAlias /cgi-bin /var/www/cgi-bin
    リクエスト http://www.project.ed.jp/cgi-bin/test.cgi は、
    サーバーの /var/www/cgi-bin/test.cgi を実行し、その結果をクライアントに返す。

U.6.2.ScriptAliasMatch

 正規表現の URL を該当ディレクトリへマップし、CGI スクリプトとして実行可能にする。

ScriptAliasMatch 正規表現-path directory
  • 正規表現-path
    CGI スクリプトへ導くキーとなるパスを正規表現(*)で記述する。
  • directory
    CGI スクリプトが存在するディレクトリへの絶対パスを指定する。
    ※ directory を引用符で囲むことも、引用符を省略することも可能。
  • ScriptAliasMatch は ScriptAlias と同等の機能であるが、URL-path に正規表現を用いることが異なる。
  • リクエストされた URL は指定の 正規表現-path と比較され、マッチしたらその部分を指定の directory に置き換える。
  • 下記はユーザーの自作 CGI へのリクエストを、当該ユーザーの CGI ディレクトリへマップし実行可能にする時によく用いられる記述である。
    ScriptAliasMatch ^/~(.*)/cgi-bin/(.*) "/home/$1/cgi-bin/$2"
    この例では、http://www.project.ed.jp/~user123/cgi-bin/test.cgi にリクエストがあった場合、 /home/user123/cgi-bin/test.cgi が参照され、その結果がクライアントに返される。

U.6.3.正規表現について

 正規表現とは文字列パターンを表現する手法で、ここでは「メタ文字」と呼ばれる記号を用いている。  基本的なメタ文字には次のようなものがある。

メタ文字意味
^文字列の先頭。
.任意の 1 文字。
*直前のパターンの 0 回以上の繰り返し。
+直前のパターンの 1 回以上の繰り返し。
?直前のパターンが 0 回または 1 回現れる。
$文字列の末尾。
( )パターンのグループ化。
グループ化パターンにマッチした部分 (URLパス) は特殊変数に仮保存される。
特殊変数はグループ左側から順に $1, $2, $3, .... が割り当てられる。

ScriptAliasMatch で例示した設定 ^/~(.*)/cgi-bin/(.*) は、次のような文字列と解釈される。
  1. ^/~
    文字列の先頭部分が /~ であること。
  2. 左側の (.*)
    任意の 1 文字と、そのパターンの 0 回以上の繰り返し (1 文字以上の任意の文字列)。
    この部分にマッチした文字列は特殊変数 $1 に保存される。
  3. /cgi-bin/
    文字列 /cgi-bin/ を指定。
  4. 右側の (.*)
    任意の 1 文字と、そのパターンの 0 回以上の繰り返し。
    この部分にマッチした文字列は特殊変数 $2 に保存される。
総合すると検出対象パターンは下記のような文字列となる。
^/~(任意の文字列)/cgi-bin/(任意の文字列)

 したがって、リクエスト URL の http://www.project.ed.jp/~user123/cgi-bin/test.cgi は、
/~user123/cgi-bin/test.cgi の部分がマッチする。
※ 実際の http セッションでは、GET /~user123/cgi-bin/test.cgi としてリクエストされる。
 グループ化パターンにマッチした user123 は $1 に、test.cgi は $2 に保存され、マップ先ディレクトリは /home/user123/cgi-bin/test.cgi が生成される。

U.6.4.ハンドラ

 ファイルが参照された時の動作をあらかじめ規定しておき、その規定動作に付けた名称をハンドラという。
※ 通常、ファイルにはファイル型 (バイナリ、テキスト、スクリプト等) に基づいた実行形態がある。

 Apache ではファイル拡張子や格納したディレクトリによってハンドラを指定できる。  ハンドラは Action, AddHandler, SetHandler といったディレクティブで追加できる外、標準でサーバーに組み込まれているものもある。
Apache の組み込みハンドラは以下の通り。
※ これらのハンドラは名称と動作が定義済みというだけであり、機能させるには AddHandler, SetHandler 等で
  適切に設定する必要がある。
  • send-as-is
    HTTPヘッダを含め、ファイルをそのままの形式で送信する。
  • cgi-script
    ファイルを CGI スクリプトとして実行可能にする。
    ただし、Options の ExecCGIがセットされていなければならない。
  • imap-file
    イメージ マップ ファイルを指定する。
  • server-info
    サーバーの設定情報を取得する。
  • server-status
    サーバーの現在のステータスを取得する。
  • type-map
    コンテンツ ネゴシエーション用のタイプ マップ ファイルとして解析する。

U.6.5.AddHandler

 ファイルの拡張子をハンドラに関連付ける。

AddHandler handler 拡張子リスト
  • default : imap-file map, type-map var
  • handler
    規定動作のハンドラ(*)名を指定する。
  • 拡張子リスト
    関連付ける拡張子を指定する。
    拡張子が複数ある場合はスペースで区切って並べる。
  • 拡張子は大文字小文字を区別しない。
  • 拡張子のドット (.) は省略可能。
  • 例えば下記のような設定をした場合、
    AddHandler cgi-script .cgi .pl
    Apache 制御下のディレクトリに存在する拡張子 .cgi と .pl のファイルは、 cgi-script に関連付けられ実行可能な CGI スクリプトとして扱われる。
    ただしそのディレクトリに、Options の ExecCGI がセットされている必要がある。

U.6.6.SetHandler

 このディレクティブが記述された、<Directory>, <Location>, <Files> セクション内のすべてのファイルに、指定されたハンドラを関連付ける。

SetHandler (handler | None)
  • handler
    規定動作のハンドラ(*)名を指定する。
  • None
    前方の SetHandler によって設定されたハンドラを無効にする。
  • 以下の記述は、各ユーザーの cgi-bin ディレクトリ内にあるすべてのファイルを cgi-script として関連付けることを指示する。
    <Directory /home/*/public_html/cgi-bin>
    Options ExecCGI
    SetHandler cgi-script
    </Directory>
    ※ この記述はユーザーの CGI ディレクトリが /home/*/cgi-bin の場合 (実習環境は該当する) は、
       機能しない。
  • ディレクトリに配置した .htaccess に SetHandler を記述した場合、当該ディレクトリ内のすべてのファイルに指定されたハンドラを関連付ける。
    ※ AddHandler を設定し、そこに記述されている拡張子のみで cgi-script を使用する限りにおいては、
       SetHandler の記述は不要。

U.6.7.Action

 特定のハンドラまたは MIME タイプに対して指定の CGI を適用する。

Action type cgi-path
  • type
    規定動作のハンドラ(*)名、または MIME タイプを指定する。
  • cgi-path
    CGI として実行可能(*)なファイルへのパスを設定する。
    (*) 他のディレクティブによって CGI スクリプトとして実行可能に設定済みであること。
  • 設定例。
    • ハンドラの場合。
      AddHandler special-extension .spex
      Action special-extension /cgi-bin/special.cgi
      拡張子が .spex であるファイルへのリクエストには、CGI スクリプト
      /cgi-bin/special.cgi が適用される。
    • MIME タイプの場合。
      Action text/javascript /cgi-bin/java.cgi
      MIME タイプが text/javascript であるファイルへのリクエストには、CGI スクリプト /cgi-bin/java.cgi が適用される。



≪ previous [[ web サーバ - Apache/2.0 の設定 ]] next ≫