CGI - Common Gateway Interface

last-modified: 12th/June/'01;
since: 1st/June/2001;

前節では Perl スクリプトのファイルをコマンドラインから直接実行できるように、コメント行に Perl のパスを記述し、実行可能属性をつけました。このファイルは、 UNIX 上でファイルを請求すると、自動的に Perl のインタープリタ perl で処理されて、結果が標準出力装置に返ってきます。

WWW での標準出力装置は、通常の場合ブラウザになります。ブラウザに表示するためには、その情報がテキストなのか HTML なのかを明示する必要があります。

と言うわけで、本節では出力内容を HTML にして、 WWW ブラウザで閲覧できるように工夫します。

まずはコマンドライン(UNIX ならシェル、 Windows なら DOS)から実行するスクリプトをおさらいしましょう。

コマンドラインからのスクリプト

hello.pl>>

 1:
 2:
 3:
#!/usr/bin/perl
#上の行は perl の所在地です。適宜書き換えてください。
print "Hello, World!\n";

print は後続の引数を出力する関数です。出力内容の最後にくっついている \n は改行を表す特殊文字です。

このスクリプトでは print で出力装置が指定されていませんので、標準出力装置が使われます。コマンドラインから実行する場合はモニタ( kterm や各種 telnet クライアント)になります。

このファイルに許可属性をつけることで、コマンドファイルになります。

シェル>>

% chmod +x hello.pl
% ./hello.pl
Hello, World!
% 

シェルプロンプトの記号は % で表しました。

UNIX 以外のコマンドラインから実行する場合は、 ./hello.pl は利用できません。 perl hello.pl としてください。

このファイルに WWW からブラウザでアクセスする場合を考えます。

CGI

CGI 用 Perl スクリプト

ブラウザからアクセスする文書は通常の場合、テキストか HTML です。ここでは HTML を出力するスクリプトを作成してみましょう。

hello.cgi>>

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
#!/usr/bin/perl
#上の行は perl の所在地です。適宜書き換えてください。
print "<html>\n";
print "<head><title>Hello!</title></head>\n";
print "<body>\n";
print "<h1>First Document</h1>\n";
print "<p>Hello, World!</p>\n";
print "</body>\n";
print "</html>\n";

これをコマンドラインから実行すると次のようになります。

シェル>>

% chmod +x hello.cgi
% ./hello.cgi
<html>
<head><title>Hello!</title></head>
<body>
<h1>First Document</h1>
<p>Hello, World!</p>
</body>
</html>
% 

さらに、この出力内容が HTML であることを明示する必要があります。そのために、スクリプトを修正しましょう。

hello.cgi>>

 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
10:
11:
12:
#!/usr/bin/perl
#上の行は perl の所在地です。適宜書き換えてください。
print "content-type: text/html\n\n";
print "<html>\n";
print "<head><title>Hello!</title></head>\n";
print "<body>\n";
print "<h1>First Document</h1>\n";
print "<p>Hello, World!</p>\n";
print "</body>\n";
print "</html>\n";

4 行めは、このファイルを取得した装置に対して、この出力を HTML として解釈するように求める文です。行末に改行文字を二回記述したことに注意してください。この改行は必須です。

ファイルの転送と許可属性の変更

このファイルを、 WWW からアクセスできるサーバー上のディレクトリに FTP クライアントで転送して、実行可能属性を付けておきます。

転送時には、転送モードを ASCII (テキスト)にしてください。 ASCII では、システムごとの改行コードの違いを適当なものに変換して送信してくれます。 BINARY (バイナリ)にすると、改行コードが狂ってしまいます。一般に、文字情報は ASCII で、画像や圧縮ファイルなどは BINARY を利用します。

転送できたら、転送先でファイルの許可属性を変更します。

サーバーが telnet, ssh などのアクセスを許していれば、いつも通り、コマンドラインから属性変更します。 FTP クライアントによってはコマンドを入力できるものも存在します。

シェル>>

% chmod +x hello.cgi

コマンドを利用できない場合は、 FTP クライアントのメニューから【属性変更】を選んで 755 を設定してください。これは、 rwxr-xr-x と同じです。

[hello.cgi の許可属性]
オーナーグループその他
読み込みr (4)r (4)r (4)
書き換えw (2)--
実行x (1)x (1)x (1)
モード755

首尾よく実行可能属性が付けられれば、全ての作業は終了です。ここにサンプルファイルを公開しておきますので、興味があればご覧ください。【実行例】

ちなみに、サーバー上にファイルを転送しただけで、許可属性を変更していない場合は、「 rw-r--r-- (644) 」になっているはずです。

通常のコンテンツの場合は、「グループ」と「その他」は区別しないでしょうが、研究室や会社の部署など、マシンの OS に登録されているユーザだけに公開したいような、内輪のコンテンツの場合は、「その他」に許可属性を与えずに、「 rwxr-x--- (750) 」としておきます。

CGI と Perl

以上が CGI で Perl スクリプトを実行する流れです。本節のサンプルでは、 Perl 文法は print 函数だけしか利用していません。もっと複雑なものになっても、基本は通常の Perl スクリプトと全く変わりません。

CGI の場合は、標準入出力がコマンドラインではなくブラウザを用います。特に入力が標準装置(キーボード)を利用できないので、フォームから入力します。このときメソッドを指定することで、入力を代入する環境変数が変わります。

CGI の Perl スクリプティングは、多くの場合、極簡単なスクリプトで大きな効果が得られます。但し、 CGI で利用できる環境変数を熟知しておく必要があります。また、高度な要件を実現するためには、システムの管理者権限が必要になります。

本稿では、 CGI に限らず、一般の Perl スクリプトで必要となる文法とその利用法を紹介することが目的です。

CGI に特化したコンテンツもいずれ作りたいと思っていますので、ご要望、ご教示・ご鞭撻を賜れましたら幸いです。よろしくお願いします m(_ _)m

Copyright: SUGAI, Manabu. Since: 2001
FC2> モビット