Webページにおかれている掲示板やアンケートなどは, CGI (Common Gateway Interface) の機能を利用して作成できます
CGIとはWWWサーバが,Webブラウザからの要求に応じてプログラムを実行するための仕組みを意味します.
通常,Webブラウザからページの送信要求を受けると,WWWサーバはファイル をそのまま送信します.しかし,CGIを利用したファイル(拡張子が `.cgi' などのファイル) の送信要求を受けた場合,WWWサーバは そのプログラムを実行することで何らかの処理を行い,その結果生成されるテキストや 画像などをWebブラウザに向けて送信します(図). また,フォーム機能によりユーザから送られてきた情報を処理する場合にもCGIを 利用します.
このWWWサーバで実行されるプログラムを``CGIプログラム'' といいます.CGIプログラムを記述する言語(Perl,Cなど) はWWWサーバで実行できるものであればどの言語で記述しても かまいません.本書では文字列の処理に優れ, 広く使われているPerlによるCGIプログラムを紹介します.
CGIプログラムは,WWWサーバでプログラムとして実行されるので, 適切に利用しないと非常に危険です. 次に,CGIプログラムを書くときの注意点をあげます. CGIプログラムのセキュリティについては,`The World Wide Web Security FAQ' (http://www.w3.org/Security/)を参照してください.
% pwd <RET> /home/t020000tf/public_html % chmod 755 sample.cgi <RET> % ls -l sample.cgi <RET> -rwxr-xr-x 1 t020000tf 4103 Jun 30 07:11 sample.cgi % _
フォーム機能を利用すると,ユーザが入力した文字などの情報をWWWサーバにある CGIプログラムに送信できます.これにより,CGIプログラムはユーザからの情報 に応じたインタラクティブな処理ができます.
この機能を利用したページを作成 するには, CGIプログラムに送信する内容を<form>タグで囲った中に, <input>タグなどで送信する内容を指定するフィールドを設定します.
<form>タグから</form>で次のページに送信したい範囲を指定します.
<form action="URL" method="送信する方法"> ...... </form>
<input>タグにより,送信する情報を入力するフィールドを作成し ます. <input>タグは,<form>タグと</form>タグに 囲まれた領域に記述してください.また,type属性によって, 他の指定できる属性が異なります.詳細は `http://www.w3.org/TR/html401/interact/forms.html' を参照してください.
<input type="入力フィールドの種類" value="値" [name="変数名" size="数値" ...]>
ここでは,SSIによりCGIプログラムを実行する例として,アクセスカウン タの作成方法を紹介します.アクセスカウンタとは,それが設置されたページ がアクセスされた回数を数える機能です.
アクセスカウンタのプログラムを作成する際に必要となる2つのファイルを 次に示します.これ らはWWWサーバによりアクセスされるので, `public_html'ディレクトリ の下に作成し,さらに,ファイルの用途に応じて各ファイルの保護モードを chmodコマンド() を使って変更します.
#!/usr/local/bin/perl -T #以下,「#」以降はコメントなので打ち込まなくてもよい. print "Content-type: text/html\n\n"; open(LOG, "number.txt"); #number.txtというファイルを開く $number = <LOG>; #ファイルに書き込まれている数字を読み込む close(LOG); #ファイルを閉じる $number++; #変数number(この場合,カウント数)に1を加える print $number; #カウント数を出力する open(LOG, "> number.txt"); #number.txtというファイルを開く print LOG $number; #1を加えた後の変数numberの値を書き込む close(LOG); #ファイルを閉じる |
% chmod 755 counter.cgi <RET> % echo 0 > number.txt <RET> % chmod 666 number.txt <RET> % _
以上のファイルを準備したら,`public_html'ディレクトリの下にアクセス カウンタを設置するページを作成し,次の1行を記述します.なお,このアク セスカウンタはSSIを利用しているので,これを埋め込むページのファイル の拡張子は`.shtml'でなければいけません.
あなたは<!--#exec cgi="counter.cgi" -->人目です.
アクセスカウンタを設置したぺージをWebブラウザで表示すると, 先の一行を記述した部分に``あなたは1人目です.''と表示 されます.以後,このページがアクセスされるたびにこの数値は1ずつ増加します. しかし,このperlプログラムは簡単な例なので, 同時に多数のアクセスが発生するとカウンタの値が`0'になってしまいます.
ここでは,フォーム機能により入力された文字などの情報をWWWサーバのCGI プログラムに送信する例として,ページにアクセスしたユーザが自分の名前 や電子メールアドレスをページに登録する,訪問者リストの作成方法を紹介しま す. 訪問者リストを作成する際に必要となるファイルを次に示します.これらはWWWサー バにより実行されるので,`public_html'ディレクトリの下に作成し, さらに,ファイルの用途に応じて各ファイルの保護モードを chmodコマンド() を利用して変更します.
使用するファイルの一覧と機能を次に示します.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>Registration</title> </head> <body> <form action="register.cgi" method="post"> <p> 名前:<input type="text" name="register_name"><br> メールアドレス:<input type="text" size="30" name="email_address"><br> ホームページアドレス:<input type="text" size="30" name="url"><br> <input type="submit" value="Registration"> </p> </form> </body> </html> |
#!/usr/local/bin/perl -T print "Content-type: text/html\n\n"; # 文書の型をブラウザへ送信. use CGI; $q = new CGI; # オブジェクトを宣言 $register_name = $q->param('register_name'); # 変数register_nameにパラメータを代入. $email_address = $q->param('email_address'); # 変数mail_addressにパラメータを代入. $url = $q->param('url'); # 変数urlにパラメータを代入. $register_name = $q->escapeHTML($register_name); # それぞれのフォームで $email_address = $q->escapeHTML($email_address); # HTMLタグが入力された場合,HTML表記へ $url = $q->escapeHTML($url); # 変換する.(ex: `>'を`>'へ) open(LOG, ">>list.txt"); # ファイルを追加書き込みモードで開く. print LOG $register_name."<>".$email_address."<>".$url."n"; # ファイルに書き込む. close(LOG); # ファイルを閉じる. print <<"EOF" # `EOF'までの内容をそのまま出力. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>Thank You</title> <style type="text/css"> dd { font-weight: bold; } </style> </head> <body bgcolor="#FFFFFF"> <h1>Registered.</h1> <dl> <dt>名前 <dd>$register_name <dt>メールアドレス <dd>$email_address <dt>ホームページアドレス <dd>$url </dl> <a href="list.cgi">LIST page</a> <br> </body> </html> __END__ |
#!/usr/local/bin/perl -T print "Content-type: text/html\n\n"; # 文書の型をブラウザへ送信. open(LOG, ``<list.txt''); # ファイルを読み取りモードで開く. while($linedata = <LOG>); # 一行一行読みとり, # <>で区切られた項目をそれぞれの変数へ代入. ($name_data, $mail_data, $url_data) = split(/<>/, $linedata, 3); $mail_data = "<a href=\"mailto:$mail_data\">$mail_data</a>"; $url_data = "<a href=\"$url_data\+">$url_data</a>"; # tabledata変数へ行のデータを追加する. $tabledata .= "<tr>\+n"; $tabledata .= "<td>$name_data</td><td>$mail_data</td><td>$url_data</td>\+n"; $tabledata .= "</tr>\+n"; close(LOG); print <<"EOF" <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>List</title> </head> <body bgcolor="#FFFFFF"> <table border="1"> <tr> <th>名前</th><th>メールアドレス</th><th>ホームページ</th> </tr> $tabledata </table> </body> </html> __END__ |
% chmod 755 register.cgi <RET> % chmod 755 list.cgi <RET> % touch list.txt <RET> % chmod 666 list.txt <RET> % _
ファイルを作成し,保護モードを設定したら, ブラウザにページ`input.html'を表示し, 入力部分(図)に文字を入力してから [Registration]を押します.入力した文字情報がWWWサーバに送信され, WWWサーバはCGIプログラム`register.cgi'を起動して 文字情報を渡します. このCGIプログラムは文字情報の各項目をlist.txtに書き込んだ上で, 登録した内容を含んだページを生成します. このページをWWWサーバがブラウザに対して送信します. 登録一覧ページへは`register.cgi'ページの下の方にある ``LIST page''というテキストリンクをクリックします. `list.cgi'では`list.txt'からデータを読み込み, ブラウザに表示します.