メニュー
目次
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である.
赤字で書かれた部分を,自分で考えて実現してみること.それぞれ次の部分にヒントが書かれている.