ここでは,SSI (Server Side Include)やCGI (Common Gateway Interface),フォーム機能の概念や記述の方法を説明し,アクセスカウンタや訪問者リストなどの利用例を紹介する.これらの機能の詳細は,市販のマニュアルなどを参照してほしい.
通常,ページの送信要求を受けると,WWWサーバはページをそのまま送信する.しかし,ページの中でも拡張子が`.shtml'のファイルの送信を要求された場合,WWWサーバはそのページの中の一部に,現在時刻や他のページの内容などを挿入してからWWWブラウザに向けて送信する.このように,送信直前にページに何らかの情報を挿入する機能をSSI (Server Side Include)と呼ぶ(図4.6).ページの中にSSIを記述するには,次の書式を用いる.
<!--#COMMAND TAG1="VALUE1" TAG2="VALUE2" -->
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="/ t00000tf/link.html" -> に更新されました.
現在時刻は <!-#EXEC CMD="date" ->です <br> あなたは<!-#EXEC CGI="counter.cgi" ->人目のお客様です.
通常,WWWブラウザからページの送信要求を受けると,WWWサーバはページをそのまま送信する.しかし,CGIを利用したファイル(拡張子が`.cgi' などのプログラム)の送信要求を受けた場合,WWWサーバはそのプログラムを実行することで何らかの処理を行い,その結果生成されるページや画像などをWWWブラウザに向けて送信する(図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/t00000tf/public_html % chmod 755 sample.cgi<RET> % ls -l sample.cgi<RET> -rwxr-xr-x 1 t00000tf 4103 Jun 30 07:11 sample.cgi % _
CGIプログラムは,WWWサーバでプログラムとして実行されるので,適切に利用しないと非常に危険である.次に,CGIプログラムを書くときの注意点を挙げる.CGIプログラムのセキュリティについては,`The World Wide Web Security FAQ'(http://www.w3.org/Security/)を参照すること.
フォーム機能を利用すると,ユーザが入力した文字などの情報をWWWサーバにあるCGIプログラムに送信できる.これにより,CGIプログラムはユーザからの情報に応じたインタラクティブな処理ができる.この機能を利用したページを作成するには,<form>タグ,<input>タグなどを使用する.
<form action="CGIプログラムのURL"> <input....> </form>
<input type="入力フィールドの種類" name="変数名" size="数値">
ここでは,SSIによりCGIプログラムを実行する例として,アクセスカウンタの作成方法を紹介する.アクセスカウンタとは,それが設置されたページがアクセスされた回数を数える機能である.
アクセスカウンタを作成する際に必要となる2つのファイルを次に示す.これらはWWWサーバによりアクセスされるので,public_htmlディレクトリの下に作成し,さらに,用途に応じて各ファイルの保護モードをchmodコマンドを使って変更しなければならない.
% chmod 755 counter.cgi<RET> % echo 0 >number.txt<RET> % chmod 666 number.txt<RET> % _
以上のファイルを準備したら,public_htmlディレクトリの下にアクセスカウンタを設置するページを作成し,次の1行を記述する.なお,このアクセスカウンタはSSIを利用しているので,これを埋め込むページのファイルの拡張子は`.shtml'でなければならない.
あなたは<!-#EXEC CGI="counter.cgi" ->人目です.
アクセスカウンタを設置したぺージをWWWブラウザで表示すると,先の一行を記述した部分に``あなたは1人目です.''と表示される.以後,このページがアクセスされる度にこの数値は1ずつ増加する.
ここでは,フォーム機能により入力された文字などの情報をWWWサーバのCGIプログラムに送信する例として,ページにアクセスしたユーザが自分の名前や電子メールアドレスをページに登録する,訪問者リストの作成方法を紹介する.訪問者リストを作成する際に必要となるファイルを次に示す.これらはWWWサーバにより実行されるので,public_htmlディレクトリの下に作成し,さらに,用途に応じて各ファイルの保護モードをchmodコマンドを使って変更しなければならない.
#!/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); #ファイルを閉じる
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html> <head><title></title></head> <body> <form action="register.cgi"> <p> NAME:<input type="TEXT" name="user_name"><br> E-MAIL ADDRESS:<input type="TEXT" size="30" name="email_address"><br> URL:<input type="TEXT" size="30" name="page_address"><br> <input type="SUBMIT" value="Registration"> </P> </form> </body> </html> |
% chmod 755 register.cgi<RET> % chmod 666 list.html<RET> % _
以上のファイルを準備したら,ブラウザにページ`input.html'を表示し,入力部分(図4.12)に文字を入力してから[Registration]を押す.入力した文字情報がWWWサーバに送信され,WWWサーバはCGIプログラム`register.cgi'を起動して文字情報を渡す.このCGIプログラムは文字情報をlist.htmlに書き込んだ上で,``Thankyou. Click here!''という文章を含んだページを生成する.このページをWWWサーバがブラウザに対して送信する.
#!/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/%(..)/pack("c",hex($1))/ge #16進数を文字 に変換 if($
tag eq "user_name"){$
value = s/\
+/ /g; #要素がUSERNAMEの場合,+を空白に変換する }else{$
value = s/\
+//g; #それ以外の要素の場合, +を消去する }$
value = s/</</g; # < を文字として出力する(タグとして認識させない)$
value = s/>/>/g; # > を文字として出力する(タグとして認識させない)$
value = s/"/"/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 "<!DOCTYPE HTML PUBLIC\
"-//W3C//DTD HTML 4.0//EN\
"\
n"; print "\
"http://www.w3.org/TR/REC-html40/strict.dtd\
">\
n"; print "<html>\
n"; print "<head><title>Thank You</title></head>\
n"; print "<body style=\
"bgcolor: #FFFFFF;\
">\
n"; print "<p>Thank you.\
n"; print "<a href=\
"list.html\
">Click here!</a>\
n"; print "</p>\
n"; print "</body>\
n"; print "</html>\
n";