next up previous contents
Next: VII. マルチメディアデータの処理 Up: 4. WWWサーバによる情報公開 - 応用編 Previous: 4.1 情報へのアクセス制限



4.2 SSI,CGI

ここでは,SSI (Server Side Include)やCGI (Common Gateway Interface),フォーム機能の概念や記述の方法を説明し,アクセスカウンタや訪問者リストなどの利用例を紹介する.これらの機能の詳細は,市販のマニュアルなどを参照してほしい.


4.2.1 SSI

通常,ページの送信要求を受けると,WWWサーバはページをそのまま送信する.しかし,ページの中でも拡張子が`.shtml'のファイルの送信を要求された場合,WWWサーバはそのページの中の一部に,現在時刻や他のページの内容などを挿入してからWWWブラウザに向けて送信する.このように,送信直前にページに何らかの情報を挿入する機能をSSI (Server Side Include)と呼ぶ(図4.6).ページの中にSSIを記述するには,次の書式を用いる.

<!--#COMMAND TAG1="VALUE1" TAG2="VALUE2" -->






図 4.6:SSIの機能
図 4.6:SSIの機能

COMMANDには次のものを指定する.


<!-#config errmsg="エラーメッセージ"->
 SSIでエラーが発生した場合、ここで設定したメッセージが出力される。
<!-#config timefmt="
#echoや#flastmodで日時を表示する際の形式指定。
 


このファイルの名前は<!-#echo var="DOCUMENT_NAME" ->です。
現在時刻は<!-#echo var="DATE_LOCAL" ->です


来訪者リスト<p>
<!-#INCLUDE VIRTUAL="list.txt" ->

このページは<p>
<!-#FLASTMOD VIRTUAL="list.html" ->に更新されました.
link.htmlは<p>
<!-#FLASTMOD VIRTUAL="/ t99000tf/link.html" ->
に更新されました.

現在時刻は <!-#EXEC CMD="date" ->です <br>
あなたは<!-#EXEC CGI="counter.cgi" ->人目のお客様です.


SSIを利用するページのファイル名の拡張子は`.shtml'にすること.


4.2.2 CGI,フォーム機能

通常,WWWブラウザからページの送信要求を受けると,WWWサーバはページをそのまま送信する.しかし,CGIを利用したファイル(拡張子が`.cgi' などのプログラム)の送信要求を受けた場合,WWWサーバはそのプログラムを実行することで何らかの処理を行い,その結果生成されるページや画像などをWWWブラウザに向けて送信する(図4.7).また,フォーム機能によりユーザから送られてきた情報を処理する場合にもCGIを利用する.



図 4.7:CGIの概念
図 4.7:CGIの概念


このように,CGIとはWWWサーバとサーバで実行されるプログラムとの橋渡しをするインタフェースである.実際の処理はサーバのプログラムが行い,その結果をWWWサーバを通じてブラウザに送信する.このWWWサーバで実行されるプログラムをCGIプログラムと呼ぶ.CGIプログラムを記述する言語(Perl,Cなど) はWWWサーバで実行できるものであれば何でもよいが,文字列の処理に優れていて,WWWサーバが変わってもプログラムを変更せずにそのまま実行でき,セキュリティを考慮したプログラムが書きやすいという理由から,ここではPerlによるCGIプログラムを説明する.

CGIプログラムのファイルは 拡張子を`.cgi'にして, public_html以下のディレクトリに置く.CGIプログラムのファイルはWWWサーバにより実行されるので,chmodコマンドを使用し,すべてのユーザに対して実行可能な設定にしておかなければならない.同様に,CGIプログラムが実行中に書き込みを行うファイルなどもすべてのユーザに対して書き込み可能な設定にしておくこと.

% pwd<RET>
/home/t99000tf/public_html
% chmod a+x sample.cgi<RET>
% ls -l sample.cgi<RET>
-rwxr-xr-x 1 t99000tf 4103 Jun 30 07:11 sample.cgi
% _

CGIプログラムを利用する際の注意

CGIプログラムは,WWWサーバでプログラムとして実行されるので,適切に利用しないと非常に危険である.次に,CGIプログラムを書くときの注意点を挙げる.CGIプログラムのセキュリティについては,`The World Wide Web Security FAQ'(http://www.w3.org/Security/)を参照すること.


CGIプログラムの利用形式

ここでは,CGIプログラムの利用形式を紹介する.

<A HREF="sample.cgi">ここ</A>をクリックするとCGIプログラムの結果が表示
されます.


<IMG SRC="sample.cgi">



フォーム機能

フォーム機能を利用すると,ユーザが入力した文字などの情報をWWWサーバにあるCGIプログラムに送信できる.これにより,CGIプログラムはユーザからの情報に応じたインタラクティブな処理ができる.この機能を利用したページを作成するには,<FORM>タグ,<INPUT>タグなどを使用する.

1.
<FORM>タグ
<FORM>タグではACTION属性にユーザが送信する情報を処理するCGIプログラムをURIで指定する.

<FORM ACTION="CGIプログラムのURI">
<INPUT....>
</FORM>
2.
<INPUT>タグ
<INPUT>タグにより,送信する情報を入力するフィールドを作成する. <INPUT>タグは,<FORM>タグと</FORM>タグに囲まれた領域に記述すること.

<INPUT TYPE="入力フィールドの種類" NAME="変数名" SIZE="数値">


4.2.3 SSI,CGIの利用例

ここでは,SSIによりCGIプログラムを実行する例として,アクセスカウンタの作成方法を紹介する.アクセスカウンタとは,それが埋め込まれたページがアクセスされた回数を数える機能である.

アクセスカウンタを作成する際に必要となる2つのファイルを次に示す.これらはWWWサーバによりアクセスされるので,public_htmlディレクトリの下に作成し,さらに,用途に応じて各ファイルの保護モードをchmodコマンドを使って変更しなければならない.

1.
4.9の内容でcounter.cgiという名前のCGIプログラムを作成し,すべてのユーザに対して実行可能となるように保護モードを設定する.
2.
中身が0という数字と改行コードのみのnumber.txtという名前のテキストファイルを作成し,すべてのユーザに対して書き込み可能となるように保護モードを設定する.

% chmod  755  counter.cgi<RET>
% chmod  777  number.txt<RET>
% _

以上のファイルを準備したら,public_htmlディレクトの下にアクセスカウンタを埋め込むページを作成し,次の1行を記述する.なお,このアクセスカウンタはSSIを利用しているので,これを埋め込むページのファイル名の拡張子は`.shtml'でなければならない.

あなたは<!-#EXEC CGI="counter.cgi" ->人目です.

アクセスカウンタを埋め込んだぺージをWWWブラウザで表示すると,先の一行を記述した部分に``あなたは1人目です.''と表示される.以後,このページがアクセスされる度にこの数値は1ずつ増加する.



図:CGIプログラム` counter.cgi'のサンプル
#!/usr/local/bin/perl -T

#以下,「#」以降はコメントなので打ち込まなくてもよい.

print "Content-type: text/html\n\n";

open(LOG, "number.txt");    #number.txtというファイルを開く
chop($number = <LOG>);      #ファイルに書き込まれている数字を読み込み,
#変数numberに代入し,改行コードを除く
close(LOG);                 #ファイルを閉じる

$number++;                  #変数number(この場合,カウント数)に1を加える
print "$number";            #カウント数を出力する

open(LOG, "> number.txt");  #number.txtというファイルを開く
print LOG "$number\n";      #1を加えた後の変数numberの値を書き込む
close(LOG);                 #ファイルを閉じる




4.2.4 CGI,フォーム機能の利用例

ここでは,フォーム機能により入力された文字などの情報をWWWサーバのCGIプログラムに送信する例として,ページにアクセスしたユーザが自分の名前や電子メールアドレスをページに登録する,訪問者リストの作成方法を紹介する.

訪問者リストを作成する際に必要となるファイルを次に示す.これらはWWWサーバにより実行されるので,public_htmlディレクトリの下に作成し,さらに,用途に応じて各ファイルの保護モードをchmodコマンドを使って変更しなければならない.

1.
4.10の内容でinput.htmlという名前のファイルを作成する.
2.
4.11の内容でregister.cgiという名前のCGIプログラムを作成し,すべてのユーザに対して実行可能となるように保護モードを設定する.


図:ページ` input.html'のサンプル
<HTML>
<HEAD><TITLE></TITLE></HEAD>
<BODY>
<FORM ACTION="register.cgi">
NAME:<INPUT TYPE="TEXT" NAME="user_name"><BR>
E-MAIL ADDRESS:<INPUT TYPE="TEXT" SIZE="30" NAME="email_address"><BR>
URI:<INPUT TYPE="TEXT" SIZE="30" NAME="page_address"><BR>
<INPUT TYPE="SUBMIT" VALUE="Registration">
</FORM>
</BODY>
</HTML>


図:CGIプログラム` register.cgi'のサンプル
#!/usr/local/bin/perl -T

print "Content-type: text/html\n\n"; #htmlにデータの型を渡す

$args = $ENV{'QUERY_STRING'}; #入力された文字を変数argsに代入

@terms = split(/&/, $args, 3); #argsを要素ごとに分割し,
foreach(@terms){
($tag, $value) = split(/=/, $_, 2); #さらに要素をキーと値に分割する
$value =  s/
if($tag eq "user_name"){
$value =  s/\+/ /g; #要素がUSERNAMEの場合,+を空白に変換する
}else{
$value =  s/\+//g; #それ以外の要素の場合, +を消去する
}
$value =  s/</&lt;/g;    # < を文字として出力する(タグとして認識させない)
$value =  s/>/&gt;/g;    # > を文字として出力する(タグとして認識させない)
$value =  s/"/&quot;/g; # " を文字として出力する(タグとして認識させない)
$tags{$tag} = $value;  #配列tagsにキーと値を代入する
}
$ENV{'PATH'}= '/usr/local/bin'; #PATHを/usr/local/binに設定
open(LIST, "| /usr/local/bin/nkf -e >> list.html");#文字コードをEUCに変換
#ファイル"list.html"に出力する
print LIST "<a href=\"$tags{'page_address'}\">$tags{'user_name'}</a>\n";
print LIST "($tags{'email_address'})<p>\n";
close(LIST);
#以下,ブラウザに出力する
print "<HTML>";
print "<HEAD><TITLE>Thank You</TITLE></HEAD>";
print "<BODY BGCOLOR=\"#FFFFFF\">";
print "Thank you.<p>";
print "<A HREF=\"list.html\">Click here!</A>";
print "</BODY>";
print "</HTML>";

DT>3.
list.htmlという名前のファイルを作成し,すべてのユーザに対して書き込み可能となるように保護モードを設定する(内容は何でも可).

% chmod  755  register.cgi<RET>
% chmod  777  list.html<RET>
% _

以上のファイルを準備したら,ブラウザにページ`input.html'を表示し,入力部分(図4.12)に文字を入力してから[Registration]を押す.すると,入力した文字情報がWWWサーバに送信され,WWWサーバはCGIプログラム`register.cgi'を起動して文字情報を渡す.このCGIプログラムは文字情報をlist.htmlに書き込んだ上で,``Thankyou. Click here!''という文章を含んだページを生成する.このページをWWWサーバがブラウザに対して送信する.

WWWサーバから送られてきたページの中の``Click here!''という文字列には list.htmlへのリンクが設定されているので,これをクリックすると登録した情報が表示される.

このプログラムでは,同時に複数のユーザが[registration]を押したときのことを考慮していない.同時に複数のユーザが書き込めるようにするには,さらにプログラムを修正する必要がある.詳しい方法については,市販の参考書などを参照すること.


図:ページ` input.html'の表示
図:ページ` input.html'の表示



next up previous contents
Next: VII. マルチメディアデータの処理 Up: 4. WWWサーバによる情報公開 - 応用編 Previous: 4.1 情報へのアクセス制限