WWW/WWWサーバによる情報公開 - 応用編/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" -->
COMMANDには次のものを指定します.
<!-#config errmsg="エラーメッセージ"-> SSIでエラーが発生した場合、ここで設定したメッセージが出力される。 <!-#config timefmt="%y/%m/%d/%H:%M"--> #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="/~t01000tf/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を利用します.
このように,CGIとはWWWサーバとサーバで実行されるプログラムとの橋渡しをするインタフェースです.実際の処理はサーバのプログラムが行い,その結果をWWWサーバを通じてブラウザに送信します.このWWWサーバで実行されるプログラムをCGIプログラムと呼びます.CGIプログラムを記述する言語(Perl,Cなど) はWWWサーバで実行できるものであれば何でもよいですが,文字列の処理に優れ,WWWサーバが置き換えられてもプログラムを変更せずにそのまま実行でき,セキュリティを考慮したプログラムが書きやすいという理由から,ここではPerlによるCGIプログラムを説明します. CGIプログラムのファイルは 拡張子を`.cgi'にして, public_html以下のディレクトリに置きます.CGIプログラムのファイルはWWWサーバにより実行されるので,chmodコマンドを使用し,すべてのユーザに対して実行可能な設定にしておかなければなりません.同様に,CGIプログラムが実行中に書き込みを行うファイルなどもすべてのユーザに対して書き込み可能な設定にしてください.
% pwd<RET> /home/t01000tf/public_html % chmod 755 sample.cgi<RET> % ls -l sample.cgi<RET> -rwxr-xr-x 1 t01000tf 4103 Jun 30 07:11 sample.cgi % _ CGIプログラムを利用する際の注意CGIプログラムは,WWWサーバでプログラムとして実行されるので,適切に利用しないと非常に危険です.次に,CGIプログラムを書くときの注意点を挙げます.CGIプログラムのセキュリティについては,`The World Wide Web Security FAQ'(http://www.w3.org/Security/)を参照してください.
フォーム機能フォーム機能を利用すると,ユーザが入力した文字などの情報をWWWサーバにあるCGIプログラムに送信できます.これにより,CGIプログラムはユーザからの情報に応じたインタラクティブな処理ができます.この機能を利用したページを作成するには,<form>タグ,<input>タグなどを使用します.
4.2.3 SSI,CGIの利用例ここでは,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ずつ増加します. 4.2.4 CGI,フォーム機能の利用例ここでは,フォーム機能により入力された文字などの情報をWWWサーバのCGIプログラムに送信する例として,ページにアクセスしたユーザが自分の名前や電子メールアドレスをページに登録する,訪問者リストの作成方法を紹介します.訪問者リストを作成する際に必要となるファイルを次に示します.これらはWWWサーバにより実行されるので,public_htmlディレクトリの下に作成し,さらに,用途に応じて各ファイルの保護モードをchmodコマンドを使って変更しなければいけません.
#!/usr/local/bin/perl -T #以下,「#」以降はコメントなので打ち込まなくてもよい. print "Content-type: text/html CGIプログラム`counter.cgi'のサンプル
% 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"; $args = $ENV{'QUERY_STRING'}; @terms = split(/&/,$args,3); foreach(@terms){ ($tag,$value) = split(/=/,$_,2); $value =~ s/%(..)/pack("C",hex($1))/ge; if ( $tag eq "user_name" ){ $value =~ s/\+/ /g; }else{ $value =~ s/\+//g; } $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/"/"/g; $tags{$tag} = $value; } $ENV{'PATH'} = '/usr/local/bin'; open(LIST,"| /usr/local/bin/nkf -e >> 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 HTML4.0//EN\"\n"; print "\"http://www.w3c.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"; 図 4.11: CGIプログラム`register.cgi'のサンプル WWWサーバから送られてきたページの中の``Click here!''という文字列には list.htmlへのリンクが設定されているので,これをクリックすると登録した情報が表示されます.
このプログラムでは,同時に複数のユーザが[Registration]を押したときのことを考慮していません.同時に複数のユーザが書き込めるようにするには,さらにプログラムを修正する必要があります.詳しい方法については,市販の参考書などを参照してください.
|