Whole document tree ![]() Apache HTTP Server Version 1.3CGI による動的コンテンツ
CGI による動的コンテンツ
CGI (Common Gateway Interface) は、ウェブサーバが コンテンツ生成をする外部プログラムと協調して動作するための方法を 定義しています。そのプログラムはしばしば CGI プログラムや CGI スクリプトと呼ばれます。CGI は、ウェブサイトに動的なコンテンツを 置くための最も簡単で一般的な方法です。このドキュメントは、 Apache ウェブサーバで CGI を設定し、 CGI プログラムを書き始めるための入門書となるでしょう。 CGI を許可するように Apache を設定するCGI プログラムを正しく動作させるには、CGI を許可するように Apache の設定を行う必要があります。 これを行なうための方法がいくつかあります。 ScriptAlias
ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/ デフォルト位置に Apache をインストールしたならば、
この例はデフォルト状態の 例えば、URL ScriptAlias ディレクトリ外の CGICGI プログラムは、セキュリティ上の理由から CGI の実行を可能にするために Options を明示的に使用するサーバのメインの設定ファイル中で <Directory /usr/local/apache/htdocs/somedir> Options +ExecCGI </Directory> 上記ディレクティブは、CGI ファイルの実行を可能にするよう Apache
に伝えます。また、どのファイルが CGI ファイルかをサーバに伝える
必要があります。次の AddHandler cgi-script cgi pl .htaccess ファイル
AllowOverride Options
Options +ExecCGI この設定では、このディレクトリにおける CGI プログラムの実行を許可するよう Apache に伝えます。 CGI プログラムを書く通常のプログラミングと CGI プログラミングの間には主に二つの違いがあります。 一つは、CGI プログラムのすべての出力には MIME-type ヘッダを付けなければなりません。これはどのような種類のコンテンツ を受け取っているかをクライアントに示す HTTP ヘッダです。 ほとんどの場合では、次のように出力します: Content-type: text/html もう一つは、出力を HTML か、 ブラウザが表示することができる何か他の形式にする必要があります。 大抵の場合は HTML でしょうが、GIF イメージや他の非 HTML コンテンツを出力する CGI プログラムを書くこともあるでしょう。 これら二点以外では、CGI プログラムを書くことは、 あなたが書いている他のプログラムと大いに似ているでしょう。 あなたの最初の CGI プログラム次に示すのは、ブラウザに 1 行印字する CGI プログラムの例です。
以下を入力し、 #!/usr/bin/perl print "Content-type: text/html\r\n\r\n"; print "Hello, World."; Perl に精通していなくても、
何が起こるかを理解することはできるはずです。
1 行目は、 好みのブラウザを開き、アドレス http://www.example.com/cgi-bin/first.pl あるいはファイルを置いたロケーションを指定すると、
しかし、まだ動かない !ウェブから CGI プログラムへのアクセスを行なったとき、 ブラウザで見る可能性がある四つの基本的なことがあります:
ファイルのパーミッションサーバはあなたの権限で実行されていないのを忘れないように。 つまり、起動するとき、サーバは特権をもたないユーザ - 通常 ``nobody'' や ``www'' の権限で実行されます。したがって、 あなたが所有するファイルを実行するには別のパーミッション が必要となります。通常、``nobody'' が実行するのに十分な パーミッションを与える方法は、ファイルに誰でも実行可能とする パーミッションを与えることです: chmod a+x first.pl また、もしあなたのプログラムが他のファイルを読み書きするならば、 それらのファイルは、これが可能となる正しいパーミッション を持っている必要があります。 これに対する例外は、サーバが suexec を使用するよう設定されている場合です。suexec は、CGI プログラムが置かれているバーチャルホストまたはユーザの ホームディレクトリによって、異なるユーザ権限で実行されるようにします。 suexec はとても厳しいパーミッションのチェックがあり、 そのチェックを通過できないと "Internal Server Error" となり、その CGI プログラムの実行は失敗します。 この場合、どのセキュリティチェックが失敗しているのかを知るために suexec ログファイルをチェックする必要があります。 パス情報コマンドラインからプログラムを実行するとき、 意識しなくてもシェルに渡される情報があります。 例えば、参照するファイルのためにどこを検索したらよいかを シェルに伝えるパスがあります。 プログラムが CGI プログラムとしてウェブサーバによって実行されるとき、 それはパスを持ちません。CGI プログラム内で呼び出すあらゆるプログラム (例えば、'sendmail' のようなもの) は、フルパスで指定する必要があるでしょう。 それにより、CGI プログラムを実行しようとしたとき、 シェルはそのようなプログラムを見つけることができます。 同様なことは、スクリプトのインタプリタ (しばしば #!/usr/bin/perl これがインタープリタへの実際のパスであることを確実にしておきます。 構文エラーCGI プログラムが失敗するのは大抵、 プログラム自身に問題がある場合です。一度 CGI の使い方を理解し、 前述の二つの誤りを犯していないならば、まず間違いなくそうでしょう。 ブラウザを通してテストを行う前に必ず、コマンドラインから プログラムの実行を試してください。 これにより、大抵の問題が起こらなくなります。 エラーログエラーログは友達です。全てのうまくいかないことは、 エラーログにメッセージを生成します。必ずそれを最初に見るべきです。 もし、あなたがウェブサイトを主催している場所がエラーログの参照を 許していないならば、きっと他のサイトで主催するべきです。 エラーログの読み方を学ぶことで、ほとんど全ての問題が迅速に確認され、 迅速に解決されるということが分かるでしょう。 裏で何が起こっているのか?CGI プログラミングに熟達すると、 裏で起こっていることについて更に理解することは有益になるでしょう。 ブラウザとサーバがどのように相互通信するかについては特にそうです。 なぜなら、``Hello, World.'' を印字するプログラムを書くことはまことに結構ですが、 それは特に有益ではありません。 環境変数環境変数は、あなたがコンピュータを使うときに辺りに存在している値です。
それらは、パス
(コマンドをタイプしたときに実行する実際のファイルを探し出すところ)、
ユーザ名、端末型などのような便利なものです。
通常の、毎日の環境変数の完全なリストを調べるには、
コマンドプロンプトで CGI の処理中、サーバとブラウザも環境変数を設定し、 それにより相互に通信することができるようになります。 その環境変数は、ブラウザタイプ (Netscape, IE, Lynx)、 サーバタイプ (Apache, IIS, WebSite)、実行されている CGI プログラムの名前などのようなものです。 これらの変数は CGI プログラマが使用することができます。 そして、それはクライアントとサーバの通信の話の半分です。 必要な変数の完全なリストは http://hoohoo.ncsa.uiuc.edu/cgi/env.html にあります。 以下の単純な Perl CGI プログラムは、
渡される全ての環境変数を表示します。同様のプログラムは、
Apache ディストリビューションの #!/usr/bin/perl print "Content-type: text/html\n\n"; foreach $key (keys %ENV) { print "$key --> $ENV{$key}<br>"; } STDIN と STDOUTサーバとクライアント間のもう一つの通信は、標準入力
( ウェブフォームから CGI プログラムへ 「特別なフォーマット」はとても単純です。フィールド名と値は イコール (=) で結ばれます。そして値の組はアンパサンド (&) で結ばれます。スペース、アンパサンド、イコールのような面倒な文字は、 それらが動作を駄目にしないようにその文字に相当する 16 進に変換されます。全データ文字列は、以下のようになります: name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey 時々、このような文字列が URL に付加されるのを見るでしょう。
その場合、サーバは CGI プログラムは、その文字列を役に立つ情報に分割する責任があります。 幸いにも、そのデータ処理を助けるライブラリやモジュールが存在します。 これらは、CGI プログラムの他の面でも同様に役に立ちます。 CGI モジュール/ライブラリCGI プログラムを書くとき、面倒な仕事の大部分をしてくれる コードライブラリまたはモジュールを使うことを検討すべきです。 これはエラーを減らし、早い開発につながります。 Perl で CGI プログラムを書いているなら、モジュールは CPAN で提供されています。 この目的のための最も普及しているモジュールは CGI.pm です。 CGI::Lite も検討しましょう。これは、ほとんどのプログラム において必要とするすべての機能の最小セットの実装です。 C で CGI プログラムを書いているなら、いろいろなオプションがあります。 これらの内の一つは http://www.boutell.com/cgic/ で提供されている CGIC ライブラリです。 更なる情報CGI に関する情報はウェブで数多く提供されています。 CGI の問題については Usenet の comp.infosystems.www.authoring.cgi で、他のユーザと論議することができます。HTML Writers Guide の -servers メーリングリストは、あなたの質問に回答してくれる偉大なリソースです。 http://www.hwg.org/lists/hwg-servers/ で更に多くを探し出すことができます。 そしてもちろん、おそらく CGI プログラムの動作に関する詳細の全てが記述されている CGI の仕様を読むべきです。オリジナルバージョンを NCSA で、 アップデートされたドラフトを Common Gateway Interface RFC プロジェクトで参照することができます。 CGI の問題について、 加わっているメーリングリストまたはニュースグループに質問を送るとき、 起こったもの、起こってほしいこと、実際に起こったことがどう違うか、 使用しているサーバ、CGI プログラムを記述している言語に関する十分な情報と、 可能であれば問題のコードを提供するようにしてください。 そうすることで、問題がより間単に見つかるようになります。 Apache のソースコードにおいて問題を発見したことを確信していない限り、 CGI の問題に関する質問を Apache バグデータベースに送るべきでないことに注目してください。 Apache HTTP Server Version 1.3![]() ![]() |