4.4 WebサーバでのCGIプログラムの実行

CGIプログラムとは,Webサーバ上で動作するプログラムです。このCGIプログラムを使用すれば,静的なHTMLへのアクセスだけでは実現できないインタラクティブなWebアクセスができます。

<この節の構成>
(1) CGIプログラムの定義
(2) CGIプログラムの呼び出し
(3) CGIプログラムに渡す情報
(4) CGIプログラムの例
(5) CGIプログラムに渡す追加情報
(6) 環境変数の定義
(7) WindowsでCGIプログラムを利用するときの注意事項
(8) UNIX版でCGIプログラムを利用するときの注意事項
(9) パス情報指定時の注意事項

(1) CGIプログラムの定義

CGIプログラムを実行するには,ScriptAliasディレクティブでCGIプログラムがあるディレクトリを指定する方式,AddHandlerディレクティブを使用しファイル拡張子にcgi-scriptハンドラを指定する方式およびSetHandlerディレクティブでcgi-scriptハンドラを指定する方式があります。

httpsd.confで設定する場合は,CGIプログラムの管理のしやすさの点で,ScriptAliasディレクティブによる設定を推奨します。

(a) ScriptAliasディレクティブの指定例

CGIプログラムのパス名を<Application Serverのインストールディレクトリ>/httpsd/cgi-bin/CGIプログラムファイル名とし,これに対してクライアントから/cgi-bin/CGIプログラムファイル名でアクセスする場合

ScriptAlias /cgi-bin/ "<Application Serverのインストールディレクトリ>/httpsd/cgi-bin/"

(b) AddHandlerディレクティブの指定例

なお,OptionsディレクティブでExecCGIオプションの設定が必要です。

(c) SetHandlerディレクティブの指定例

(2) CGIプログラムの呼び出し

CGIプログラムはWebブラウザから次の形式のURLを指定して呼び出します。

http://ホスト名〔:ポート番号〕/パス名〔?問い合わせ文字列

(3) CGIプログラムに渡す情報

WebサーバからCGIプログラムに環境変数を渡します。詳細は「付録B CGIプログラムに渡す環境変数」を参照してください。

(4) CGIプログラムの例

CGIプログラムのサンプルプログラムと,その実行例を説明します。

サンプルCGIプログラム
Windows版で使用可能なサンプルプログラムのソース例を次に示します。これはPerl言語で書かれたプログラムで,ファイル名をtest-cgi.plとします。

#! c:¥bin¥perl.exe

$argc=$#ARGV+1;
print "Content-Type: text/plain¥n";
print "¥n";
print "argc is $argc. argv is ¥"@ARGV¥".¥n";
print "SERVER_SOFTWARE = $ENV{'SERVER_SOFTWARE'}¥n";
print "SERVER_NAME = $ENV{'SERVER_NAME'}¥n";
print "GATEWAY_INTERFACE = $ENV{'GATEWAY_INTERFACE'}¥n";
print "SERVER_PROTOCOL = $ENV{'SERVER_PROTOCOL'}¥n";
print "SERVER_PORT = $ENV{'SERVER_PORT'}¥n";
print "REQUEST_METHOD = $ENV{'REQUEST_METHOD'}¥n";
print "HTTP_ACCEPT = ¥"$ENV{'HTTP_ACCEPT'}¥"¥n";
print "PATH_INFO = ¥"$ENV{'PATH_INFO'}¥"¥n";
print "PATH_TRANSLATED = ¥"$ENV{'PATH_TRANSLATED'}¥"¥n";
print "SCRIPT_NAME = ¥"$ENV{'SCRIPT_NAME'}¥"¥n";
print "QUERY_STRING = ¥"$ENV{'QUERY_STRING'}¥"¥n";
print "REMOTE_HOST = $ENV{'REMOTE_HOST'}¥n";
print "REMOTE_ADDR = $ENV{'REMOTE_ADDR'}¥n";
print "REMOTE_USER = $ENV{'REMOTE_USER'}¥n";
print "AUTH_TYPE = $ENV{'AUTH_TYPE'}¥n";
print "CONTENT_TYPE = $ENV{'CONTENT_TYPE'}¥n";
print "CONTENT_LENGTH = $ENV{'CONTENT_LENGTH'}¥n";

CGIプログラムの実行
Webブラウザに次に示すように指定して,サンプルCGIプログラムを呼び出します。

http://www.example.com/cgi-bin/test-cgi.pl/ABC?X=1&Y=2

サンプルプログラムの実行結果
[図データ]

(5) CGIプログラムに渡す追加情報

CGI/1.1の環境変数以外にWebサーバからCGIプログラムに情報を渡す場合の指定方法について説明します。

コンフィグファイルにCGIプログラムに渡す環境変数や,その値を指定できます。CGIプログラムに渡さない環境変数の指定もできます。

PassEnv 環境変数                  CGIプログラムに渡す環境変数の指定
SetEnv 環境変数                CGIプログラムに渡す環境変数とその値の指定
UnsetEnv 環境変数                 CGIプログラムに渡さない環境変数の指定

(6) 環境変数の定義

クライアントのリクエストを基に,環境変数を定義できます。リクエストしているクライアントのホスト名やIPアドレスなどを基に環境変数を定義したり,環境変数の設定を解除したりできます。

SetEnvIfNoCase Request_URI "¥.(gif)|(jpg)$" request_is_image

この場合,ファイル拡張子が.gifまたは.jpgのとき(このディレクティブの場合,大文字,小文字の区別はしません),request_is_imageという環境変数をCGIプログラムに渡します。

(7) WindowsでCGIプログラムを利用するときの注意事項

(a) CGIプログラム作成時の注意

CGIプログラムとサーバスレッド間のデータ送受信には,CGIプログラムの標準入力,標準出力,標準エラー出力を使用しています。データ送受信中にはTimeoutディレクティブは有効になります。CGIプログラム作成時には,データの送受信完了後は,標準入出力などを閉じるかまたは終了してください。

(b) CGIプログラムの強制終了

CGIプログラムはWebサーバが停止しても,CGIプログラム自身が処理を終えるまで終了しません。CGIプログラムを強制終了するには「タスクマネージャ」から終了させます。

(8) UNIX版でCGIプログラムを利用するときの注意事項

CGIプログラムには,User,Groupディレクティブ指定値での実行権限が必要です。

(9) パス情報指定時の注意事項

リクエストURLに,CGIプログラムに渡すパス情報が指定された場合,そのパス情報を環境変数PATH_INFOに,パス情報をファイルシステム上のパスに変換した値を環境変数PATH_TRANSLATEDに設定します。パス情報をファイルシステム上のパスに変換する際には,DocumentRootディレクティブに指定されたパスを基点とします。パス情報に対し,Aliasディレクティブなどで別名を指定している場合は,その指定に従って変換します。

Webサーバの設定によって,環境変数PATH_TRANSLATEDに設定されたパスへのアクセスを許可していない場合には,エラーログにアクセス拒否のメッセージを出力します。このメッセージを出力した場合でも,WebサーバはCGIプログラムを実行し,リクエスト処理を続行します。この際,環境変数PATH_TRANSLATEDもCGIプログラムに渡されます。

(例)ドキュメントルートが "C:/Program Files/Hitachi/Cosminexus/httpsd",Webブラウザからの要求が "http://www.example.com/cgi-bin/test-cgi.pl/ABC"(CGIプログラム"test-cgi.pl"を実行するリクエストに,パス情報として "/ABC" を付加)の場合の,エラーログ出力例を次に示します。

[Fri Feb 20 12:00:00 2004] [error] [client 192.168.1.1] client denied by server configuration: C:/Program Files/Hitachi/Cosminexus/httpsd/ABC