トップへ
田村研究室

インターネット利用技術演習

2009年度

2009
6/8

CGIの基礎

CGIとは

Webサーバ上で何かプログラムを動作させるためのインタフェース

特定のURLで指示される何かのプログラムファイルにアクセスした時に,そのプログラムをWebサーバ上で動作させるための仕組みのこと.Common Gateway Interfaceの略。例えば,

http://どこかのサーバ/なんとか.cgi
						

のように,拡張子が「.cgi」のものがCGI対応のプログラムファイルであることが多い.この場合「なんとか.cgi」という名前が付けられたプログラムファイルがWebサーバ上で動作し,プログラムされた目的を果たすように動作する.

このプログラムファイルの目的には,通常次のようなものが考えられる.

  • 動的なHTMLファイルの作成 … 「ようこそ●●さん」や「おはよう/こんばんは」などアクセスされた状況によりページの内容をその場で作成するプログラム,あるいは
  • その場で計算・集計した数値の作成 … アクセスカウンタやアンケートの集計,リアルタイムの数値をその場で計算出力するプログラム
  • 画像データの作成 … ユーザに要求された画像や,その場の状況に応じた画像データを出力するプログラム

こうしたCGIプログラムの部品を使って,次のようなサイトを構築することになる.

  • オンラインショッピングサイト (選択した商品によって合計金額を変更するバスケット機能に必要)
  • 検索サイト (入力したキーワードによって検索結果をその場で作成)

CGI は,実用場面では通常、WWWサーバの背後(バックエンド)に控えているデータベースシステムとの間のやり取りをするためのインタフェースとして動作す る。必要な情報をその場で加工して、要求されたWebページの情報をその瞬間に新たに作り出すことができるようになる。

(注) 本来CGIという言葉そのものは、WWWサーバと、CGIによって起動されたプログラムとの間のインターフェースそのものを指す。このCGIに基づくプロ グラムのことを「CGIプログラム」と呼ぶ。しかし世間では,正確には「CGIプログラムを利用する」と記述すべきところを「CGIを使う」などと略して 表現することも多く,誤解を招いている.

インターフェースとしてのCGIは,具体的に次を定義している.

  • WWWサーバからCGIプログラムへ情報を受け渡す方法1: 環境変数
  • WWWサーバからCGIプログラムへ情報を受け渡す方法2: 標準入力
  • CGIプログラムからWWWサーバへ情報を受け渡す方法: 標準出力

CGIスクリプトとCGIプログラム

CGIで実行されるプログラムは、C言語やJava、Fortran、COBOLなどどんな言語で書かれたものでもよく、そのサーバ上で動作しさえすればよい

特に、スクリプト言語で書かれたものを「CGIスクリプト」と呼ぶ

参考: スクリプト言語とは

CGIプログラム(スクリプト)の拡張子が「.cgi」であるのは,慣習的なもので深い意味はなく,サーバ側の設定によって変更できる.ただし,サーバによって起動できる拡張子をこのように「.cgi」だけに限定しておくことは,セキュリティを確保する上で重要である.

CGI利用上の注意

  • 自作のCGIプログラム(スクリプト)は、そのプログラムを単独で動作させ、動作確認した上でWebページに組み込むこと
  • 万が一、そのCGIプログラムが暴走した場合、Webサーバ自体が暴走することがありうる
  • Webサーバによっては、ユーザのCGI利用自体を制限している所がある
  • Webサーバによって利用できるスクリプト言語が制限されている

CGIスクリプトの起動方法

CGIスクリプトを起動させるには、単にCGI用のURLにアクセスすればよい。またHTML中に<a href>を使ってCGIスクリプトのURLへのリンクを張っておけば、ユーザにCGIをあまり意識させることなく、そのCGIへ誘導することができる。

また,別のテキストで説明するように、入力フォームの<form action="CGIのURL">もよく使われる。

CGIスクリプトのサンプル

CGIスクリプトを作成するには、上記に示した入力フォームからのデータ入力方法、Webサーバなどシステムプロセスが実行者となる、といった点が通常のプログラム(スクリプト)と異なるだけで、後は普通のプログラム作成と同様である。

ここでは、シェルスクリプトを利用したCGIスクリプトの例を示す。シェルスクリプトについて参照のこと

例1:あるメッセージを表示するだけのCGI

#!/bin/sh
echo Content-type: text/plain
echo

echo "メッセージ"

1行目は、シェルスクリプトとして必要な部分であり,このシェルスクリプトを実行するコマンドシェルを指定している.

2行目以降がスクリプトの本体である.2行目は出力する情報の形式を指定するための出力命令である。ここで指定するものとしては,次のようなものがある.

  • text/plain: ただのテキスト(書式なし)
  • text/html: HTML形式で書かれたテキスト
  • img/gif: gif形式の画像
  • img/jpeg: jpeg形式の画像

3行目は,空メッセージの表示命令である.この空メッセージはブラウザへの指示(HTMLヘッダの送信)が終了したことを意味し、それ以降の出力がページデータの本体であることを指示する。

4行目でメッセージを表示する.

も しも表示するメッセージに日本語が含まれる場合には,作成したCGIスクリプトファイルを保存する際に,文字コードを日本語EUCにする必要がある.例え ば秀丸エディタを使用する場合には,「名前を付けて保存」したときに表示されるファイル保存ダイアログで,「文字コード」の中から「日本語(EUC)」及 び「改行コード」として「LF」を選択することを忘れないこと.

例2:メッセージを太字で表示するCGI

#!/bin/sh
echo Content-type: text/html
echo

echo "<html>"
echo "<body>"
echo "<b>"
echo "メッセージ"
echo "</b>"
echo "</body>"
echo "</html>"

例1と違って,echo 命令の対象がダブルコーテーション「"」で括られている.これは,出力したいHTMLタグに「<」また「>」が含まれているためである.シェ ルスクリプトでは,「<」と「>」に特別な意味があるため,そのままHTMLタグを出力しようとすると,コマンドの一部だと誤解 されてしまう.シェルスクリプトでは,ダブルコーテーションで括られたものは単なる文字列として扱われるため,この例ではダブルコーテーションを使って出 力したいメッセージを括る必要がある.

例3: アクセスカウンタの骨組みの例

#!/bin/sh
echo Content-type: text/html
echo

echo "<html>"
echo "<body>"

カウントデータファイル"count.dat"から、現在のカウント数を読み出す
現在のカウント数に+1する
echo カウント数
+1したカウント数をカウントデータファイルに書き戻す
echo "</body>"
echo "</html>"

アクセスカウンタとは,アクセスされるたびに数を1ずつふやしていくカウンタのことで,ページの閲覧者の数を数えるた めに設置されていることが多い.このような場合,アクセスされるたびに表示内容を変更する必要があり,CGIによって数を数えるプログラム処理を呼び出す ことになる.

アクセスカウンタを実現するためには,前回表示した数をどこかに記憶しておく必要がある.その記憶しておいた数を+1して表示し,その表示した数を再び記憶しておけばよい.アクセスされるたび(ページを表示するたび)にその動作を繰り返す.その例が上記の例3である.

赤字で書かれた部分を,自分で考えて実現してみること.それぞれ次の部分にヒントが書かれている.