Hitachi Web Server

[目次][用語][索引][前へ][次へ]

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プログラムのパス名をC:/Program Files/Hitachi/httpsd/cgi-bin/CGIプログラムファイル名とし,これに対してクライアントから/cgi-bin/CGIプログラムファイル名でアクセスする場合

 
ScriptAlias /cgi-bin/ "C:/Program Files/Hitachi/httpsd/cgi-bin/"   
 
(b) AddHandlerディレクティブの指定例

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

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

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

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

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

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

WebサーバからCGIプログラムに環境変数を渡します。詳細は「付録C 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プログラムを強制終了するには「タスクマネージャ」から終了させます。Windows 2000でサービス起動されたサーバの下で実行するCGIプログラムを終了させるには,Windows 2000 Support Toolsに付属のkill.exeを利用してください。

(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/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/httpsd/ABC