CGI スクリプトの仕組み

「Web ページの仕組み」という記事では、HTML の基本機能について説明し、テキストとグラフィックを含む Web ページの作成方法を示しています。また、ホスティング サービスを使用してページを「オンエア」する方法も示します。新しい Web サイト デザイナーがサイトを立ち上げた後によく尋ねる質問の 1 つは、「CGI スクリプトとは何ですか? 自分のサイトでどのように使用できるのですか?」です。または、「サイト上にインタラクティブなフォームを作成するにはどうすればよいですか?」

この記事では、CGI スクリプトに関する質問に答え、独自のスクリプトを作成する方法を説明します。この過程で、Web サーバーについても少し学習します。始めましょう!

ウェブサーバー

 CGI スクリプトの仕組み

「Web サーバーの仕組み」の記事で説明されているように、Web サーバーは非常に単純です。最も基本的な場合、Web サーバーは単にディスクからファイルを取得し、それを要求元のブラウザにネットワーク経由で送信します。 URL http://www.bygpub.com/books/tg2rw/author.htmを入力するとします。サーバーはファイル/books/tg2rw/author.htmに対するリクエストを受け取ります。次の図を見ると、サーバーがそのリクエストをどのように解決するかがわかります。

セットアップ中に、Web サーバーは、 c:\My Documents\wwwがサーバーのルート ディレクトリであることを理解するように指示されます。次に、そのルートから/books/tg2rw/author.htmを探します。 URL http://www.bygpub.com/books/tg2rw/を要求すると、サーバーは、そのディレクトリのデフォルト ファイルを探していることを理解します。デフォルトのファイルを見つけるために、index.html、index.htm、default.html、default.htm といういくつかの異なるファイル名が検索されます。サーバーによっては、他のサーバーも検索する場合があります。したがって、サーバーはhttp://www.bygpub.com/books/tg2rw/http://www.bygpub.com/books/tg2rw/index.htmに変換し、そのファイルを配信します。他のすべてのファイルは、ファイルに明示的に名前を付けて指定する必要があります。

これは、すべての Web サーバーが静的ファイルを処理する方法です。ほとんどの Web サーバーは、 Common Gateway Interface (CGI) と呼ばれるメカニズムを通じて、動的ファイルも処理します。当時は知らなかったとしても、Web 上のあらゆる場所で CGI を見たことがあるでしょう。例えば:

  • どのゲストブックでも HTML フォームにメッセージを入力でき、次回ゲストブックを表示すると、そのページに新しいエントリが表示されます。
  • では、フォームにドメイン名を入力できます。返されるページは、入力したドメイン名に応じて異なります。
  • どの検索エンジンでも、HTML フォームにキーワードを入力すると、入力したキーワードに基づいてページが動的に作成されます。

これらの動的ページはすべて CGI を使用しています。

CGIの仕組み

ほとんどの Web サーバーでは、CGI メカニズムが次の方法で標準化されています。サーバーがルートとみなす通常のディレクトリ ツリーに、 cgi-binという名前のサブディレクトリを作成します。 (このディレクトリは、前のページの図で確認できます。) サーバーは、特別な cgi-bin ディレクトリから要求されたファイルは、単に読み取って送信するだけでなく、実行する必要があることを理解します。実行されたプログラムの出力は、ページを要求したブラウザに実際に送信されたものです。実行可能ファイルは通常、 C コンパイラの出力のような純粋な実行可能ファイル、またはPERLスクリプトのいずれかです。 PERL は、CGI スクリプト用の非常に人気のある言語です。

ブラウザに次の URL を入力すると想像してください: https://www.computerbasic.click/cgi-bin/search.pl 。サーバーは、 search.pl がcgi-bin ディレクトリにあることを認識したため、 search.pl (PERL スクリプト) を実行し、その実行の出力をブラウザに送信します。

次の条件を満たす場合は、独自のスクリプトを作成して CGI を試すことができます。

  • CPERLなどのプログラミング言語を知っているとします。
  • CGI スクリプトを処理する Web サーバーにアクセスできる。 Web サイトをホストするために Web ホスティング サービスに料金を支払っている場合は、ホストを通じて CGI スクリプトにアクセスできる可能性があります。詳細についてはホスティング サービスにご確認ください。そうでない場合は、自宅のマシンに Web サーバーをインストールし、その使い方を学ぶことで実験できます。 2 番目のオプションは少し複雑ですが、その過程で多くのことを学べることは間違いありません。

単純な CGI スクリプト

cgi-bin ディレクトリ (前のセクションを参照) にアクセスでき、 C プログラミング言語またはPERL のいずれかを知っていると仮定すると、CGI を使って興味深い実験をたくさん行うことができます。可能な限り単純な CGI スクリプトを作成することから始めましょう。

「Web ページの仕組み」の記事では、最も単純な HTML Web ページを検討しました。次のような感じでした。

 <html>
  <本文>
     <h1>こんにちは!</h1>
  </body>
</html>

可能な限り単純な CGI スクリプトを実行すると、この単純な静的ページが出力として作成されます。この CGI プログラムを C で書いた場合は次のようになります。

 #include <stdio.h>

int main()
{
  printf("コンテンツタイプ: text/html\n\n");
  printf("<html>\n");
  printf("<本体>\n");
  printf("<h1>こんにちは!</h1>\n");
  printf("</body>\n");
  printf("</html>\n");
  0を返します。
}

Web サーバーで、このプログラムをファイルsimplest.cに入力し、次のようにコンパイルしました。

 gcc simplest.c -o simplest.cgi

( C プログラムのコンパイルの詳細については、「C プログラミングの仕組み」を参照してください。)

simplest.cgiをcgi-binディレクトリに置くことで実行できるようになります。ご覧のとおり、スクリプトが行うことは、「こんにちは!」というページを生成することだけです。唯一予想外の部分は次の行です。

 printf("コンテンツタイプ: text/html\n\n");

「Content-type: text/html\n\n」という行は、CGI スクリプトによってブラウザに最初に送信される必要がある特別なテキストです。それを忘れない限り、すべてうまくいきます。忘れた場合、ブラウザはスクリプトの出力を拒否します。

PERL でも同じことができます。この PERL コードをsimplest.plという名前のファイルに入力します。

 #! /usr/bin/perl
print "コンテンツ タイプ: text/html\n\n";
print "<html><body><h1>Hello World!";
print "</h1></body></html>\n";

ファイルを cgi-bin ディレクトリに置きます。 UNIX マシンでは、次のように入力すると役立つ場合があります。

 chmod 755 simplest.pl

これにより、スクリプトが実行可能であることが UNIX に通知されます。

CGI スクリプトの背後にある基本的な考え方を見てきました。それは本当に簡単です!プログラムが実行され、その出力がスクリプトを呼び出したブラウザに送信されます。標準出力に送信される通常の出力は、ブラウザーに送信されます。

ただし、CGI スクリプトの本質は、動的なコンテンツを作成することです。スクリプトが実行されるたびに、出力は異なります。結局のところ、スクリプトを実行するたびに出力が同じである場合は、静的ページを使用した方がよいでしょう。次の C プログラムは、非常に単純な動的コンテンツを示しています。

 #include <stdio.h>

int インクリメントカウント()
{
  ファイル*f;
  int i;

  f=fopen("count.txt", "r+");
  もし (!f)
  {
     スリープ(1);
     f=fopen("count.txt", "r+");
     もし (!f)
       -1 を返します。
  }

  fscanf(f, "%d", &i);
  i++;
  fseek(f,0,SEEK_SET);
  fprintf(f, "%d", i);
  fclose(f);
  私を返します。
}

int main()
{
  printf("コンテンツタイプ: text/html\n\n");
  printf("<html>\n");
  printf("<本体>\n");
  printf("<h1>現在のカウントは次のとおりです: ")
  printf("%d</h1>\n", incrementcount());
  printf("</body>\n");
  printf("</html>\n");
  0を返します。
}

テキスト エディタを使用して、このプログラムをcount.cという名前のファイルに入力します。次のように入力してコンパイルします。

 gcc count.c -o count.cgi

count.txtという名前の別のテキスト ファイルを作成し、その中にゼロを 1 つ入れます。 counter.cgicount.txt をcgi-binディレクトリに配置すると、スクリプトを実行できます。スクリプトが行うことは、「現在のカウントは次のとおりです: X」というページを生成することだけです。X は、スクリプトを実行するたびに 1 回増加します。何度か実行して、ページのコンテンツが変化するのを確認してください。

count.txtファイルには現在のカウントが保持され、little incrementcount()関数はcount.txtファイル内のカウントをインクリメントする関数です。この関数は、 count.txtファイルを開き、そこから数値を読み取り、数値をインクリメントしてファイルに書き込みます。この関数は実際にファイルを 2 回開こうとします。これは、2 人が同時にファイルにアクセスしようとした場合に備えて行われます。確かに確実なテクニックではありませんが、これほど単純なものであれば機能します。 2 回目の試行でファイルを開くことができない場合、呼び出し元に返されるエラー値は -1 です。より洗練されたプログラムは、戻り値 -1 を認識し、適切なエラー メッセージを生成します。

フォーム: 入力の送信

CGI スクリプトの作成は非常に簡単であることがわかりました。 Web サーバーは、cgi-bin ディレクトリに配置された実行可能ファイルを実行し、実行可能ファイルが stdout に送信する出力は、スクリプトを呼び出したブラウザに表示されます。ここで必要なのは、入力をスクリプトに送信する方法です。入力を送信する通常の方法は、HTMLフォームを使用することです。

Web 上のいたるところでフォームを目にします。何かを入力できるページはすべてフォームです。これらは、検索エンジン、ゲストブック、アンケートなどで見られます。「コンピューター入門」.com のホームページには、少なくとも 2 つのミニフォームが含まれており、1 つは「どうやってここに来ましたか?」に関するものです。サイドバーと提案サイドバー用です (はい、1 つの HTML ページに複数のフォームを含めることができます)。 HTML ページ上にフォームを作成し、フォームの HTML タグで、ユーザーがフォーム上の[送信]ボタンをクリックしたときに呼び出される CGI スクリプトの名前を指定します。ユーザーがフォームに入力した値はパッケージ化されてスクリプトに送信され、スクリプトはそれらを任意の方法で使用できます。

あなたは実際、この種のことを絶えず見てきましたが、それが起こっていることに気づいていなかったのかもしれません。たとえば、 に移動し、「検索:」ボックスに「test」という単語を入力し、「Go Get It!」ボタンを押します。ボタン。結果ページの URL は次のようになります。

 http://www.lycos.com/cgi-bin/pursuit?matchmode=and
                    &cat=lycos&query=test&x=10&y=9

Lycos のホームページがフォームであることがわかります。 Lycos の cgi-bin ディレクトリには、追求という名前のスクリプトがあります。フォームは 5 つのパラメーターをスクリプトに送信します。

  1. マッチモード=そして
  2. 猫=ライコス
  3. クエリ=テスト
  4. x=10
  5. y=9

3 番目は、入力した検索文字列です。他の 4 つは、スクリプトにとっても同様に意味を持ちます。 CGI スクリプトは、Lycos データベースに「test」という単語を照会し、結果を返します。それが検索エンジンの核心です。

これを試してみるために、簡単なフォームを作成してみましょう。 simpleform.htmという名前のファイルを作成し、次の HTML をそのファイルに入力します。

 <html>
<本文>
  <h1>非常にシンプルなフォーム<h1>
  <FORM METHOD=GET ACTION="https://www.computerbasic.click/
cgi-bin/simpleform.cgi">
  あなたの名前を入力してください:
  <input name="名前" size=20 maxlength=50>
  <P>
  <INPUT TYPE=送信値="送信">
  <INPUT TYPE=リセット値="リセット">
  </FORM>
</body>
</html>

HTML コードは、 https://www.computerbasic.click/cgi-bin/simpleform.cgiの CGI スクリプトに送信される GET メソッドを使用するフォームの作成を指定します。フォーム内にはテキスト入力領域に加えて、標準の送信ボタンとリセット ボタンがあります。

フォームによって参照されるファイルhttps://www.computerbasic.click/cgi-bin/simpleform.cgiは C プログラムです。これは、 simpleform.cという名前のファイルに配置された次の C コードとして誕生しました。

 #include <stdio.h>
#include <stdlib.h>

int main()
{
  printf("コンテンツタイプ: text/html\n\n");
  printf("<html>\n");
  printf("<本体>\n");
  printf("<h1>入力された値は次のとおりです: ")
  printf("%s</h1>\n", getenv("QUERY_STRING"));
  printf("</body>\n");
  printf("</html>\n");
  0を返します。
}

以下のコマンドでコンパイルしました。

 gcc simpleform.c -o simpleform.cgi

そして、それは cgi-bin ディレクトリに配置されました。このプログラムは、フォームから送信された値を取得して表示するだけです。たとえば、次のように表示される場合があります。

入力された値は次のとおりです: Name=John+Smith

Nameはフォーム内のテキスト入力フィールドの識別子であり (フォーム上の各入力フィールドには一意の識別子が必要です)、 John+Smith はフォームに入力される可能性のある一般的な名前です。 「+」がスペース文字に置き換わることに注意してください。

この例から、フォームを設定し、フォームから CGI スクリプトにデータを取得する基本プロセスが非常に簡単であることがわかります。注意すべき点がいくつかあります。

  • フォーム上の各入力フィールドには一意の識別子が必要です。
  • フォームでは GET メソッドまたは POST メソッドを使用する必要があります。 GET メソッドには、スクリプトに送信された URL でフォームの値を確認できるため、デバッグが容易になるという利点があります。
  • GET メソッドで送信できる文字数には明確な制限があるため、大きなフォームの場合は POST が推奨されます。
  • GET メソッド経由で受信されるデータは、QUERY_STRING 環境変数を調べることによって受信されます (通常、C のgetenv関数または PERL の $ENV 機能を使用して読み取られます)。 POST メソッド経由で受信したデータは、C での取得または PERL での読み取りを使用して STDIN 経由で利用できます。
  • 受信するデータには、すべてのフィールドが 1 つの文字列に連結されており、多くの文字が置換されるため、変換が必要になります。たとえば、すべてのスペースはプラスに置き換えられます。

QUERY_STRING 環境変数は、環境変数一般のトピックを取り上げます。 CGI スクリプトで検査できる環境変数は次のとおりです。

  • AUTH_TYPE
  • CONTENT_LENGTH
  • コンテンツタイプ
  • ゲートウェイ_インターフェース
  • HTTP_ACCEPT
  • HTTP_USER_AGENT
  • PATH_INFO
  • PATH_TRANSLATED
  • QUERY_STRING
  • REMOTE_ADDR
  • REMOTE_HOST
  • REMOTE_IDENT
  • REMOTE_USER
  • REQUEST_METHOD
  • SCRIPT_NAME
  • SERVER_NAME
  • サーバー_ポート
  • サーバー_プロトコル
  • サーバー_ソフトウェア

これらの環境変数には、入力文字列の長さ (CONTENT_LENGTH)、使用されたメソッド (GET または POST) など、あらゆる種類の興味深い情報が埋め込まれています。REQUEST_METHOD を使用すると、入力を STDIN で検索するか QUERY_STRING で検索するかを判断できます。 )、ユーザーのマシンのIP アドレス(REMOTE_ADDR) など。これらの変数の詳細な説明については、「 」を参照してください。

実際のフォームの作成

実際のフォームはさまざまな入力領域で構成され、文字マッピングを元に戻して個々の文字列を解析するには、スクリプト内にある程度のコードが必要になります。まず、フォーム上の標準入力コントロールを見てみましょう。それらには次のものが含まれます。

  • 単一行のテキスト入力
  • 複数行のテキスト入力
  • 選択リスト
  • チェックボックス
  • ラジオボタン
  • フォームの送信またはクリアのための特殊なボタン

他のページと同様に、これらのコントロールを他の静的テキストやグラフィックと組み合わせることができます。

以下に、さまざまな制御タグの使用法を示すいくつかの例を示します。

単一行編集

「入力」という語は、単一行の編集領域を示します。 「名前」フィールドは、CGI スクリプトにコントロールの識別子を提供し、フォーム上の各コントロールに対して一意である必要があります。 「サイズ」フィールドは、フォーム上の入力領域の幅を文字数で示します。 「Maxlength」は、入力領域の最大文字数を制限します。 「値」は初期値を設定します。

名前を入力してください: <input name="名前" size=30 maxlength=50
value="サンプル">

通常、入力領域の前には、入力フィールドの目的を示す静的テキストが続きます。ここに表示されているのは、静的テキスト「名前を入力してください:」です。

値「type=int」を追加すると、入力を整数値に制限できます。デフォルトでは、タイプは「テキスト」であり、任意の文字を受け入れます。

複数行編集

複数行の編集領域は入力領域に似ています。コントロールの名前を定義し、フォーム上の行と列のサイズを定義します。 </textarea> タグの前に配置したものはすべて、デフォルト値としてコントロールに表示されます。

 <textarea name="会社住所"cols=30
rows=4></textarea>

チェックボックス

チェック ボックスは、タイプが「チェックボックス」に設定された入力領域の特殊な形式です。

 <input type=checkbox name="含める" value=1>

チェックボックスが選択されている場合、値が返されます。

ラジオボタン

ラジオ ボタンはチェック ボックスに似ていますが、視覚的にグループ化されています。

検索領域を選択します:<br>
<入力タイプ=ラジオチェック済み名=ユニバース値=US-STOCK>
株式
<入力タイプ=ラジオ名=ユニバース値=CA-STOCK>
カナダ株
<入力タイプ=ラジオ名=ユニバース値=MMF>
マネーマーケット
<入力タイプ=ラジオ名=ユニバース値=MUTUAL>
投資信託

デフォルトのラジオボタンには「CHECKED」という単語を付けることができることに注意してください。また、同じグループ内のラジオ ボタンはすべて同じ名前であることに注意してください。

選択リスト

選択リストは、ユーザーに多数のオプションからの選択肢を提供します。選択リストのタグを使用すると、「サイズ」フィールドに表示される行の数と、すべてのオプションの値を指定できます。

オプションを選択してください<br>
<SELECT size=2 NAME="オプション">
    <オプション> オプション 1
    <オプション> オプション 2
    <オプション> オプション 3
    <オプション> オプション 4
</選択>

単語 MULTIPLE は複数選択機能を作成します。

特殊なボタン

次のタグは、フォームをサーバーに送信するボタンとフォームをリセットするボタンの 2 つの特殊なボタンを作成します。

 <INPUT TYPE=送信値="送信">
<INPUT TYPE=リセット値="リセット">

すべてをまとめる

Web ページの 1 つに対して簡単なアンケートを作成するとします。たとえば、読者の名前、性別、年齢、コメントを入力して CGI スクリプトで処理したいとします。 HTML フォームは https://www.computerbasic.click/survey.htm という名前のファイルに存在し、次のようになります。

 <html>
  <本文>
    <h1>HSW アンケートフォーム<h1>
    <FORM METHOD=ポストアクション=http:
//www.computerbasic.click/cgi-bin/survey.cgi">
    あなたの名前を入力してください:
    <input name="名前" size=20 maxlength=50>
    <P>性別を入力してください:
    <input type=radio CHECKED name=sex value=MALE>男性
    <input type=radio name=sex value=FEMALE>女性
    <P>年齢を選択してください<br>
    <SELECT サイズ=2 名前=年齢>
      <オプション> 1-10
      <オプション> 11-20
      <オプション> 21-30
      <オプション> 31-40
      <オプション> 41-50
      <オプション> 51-60
      <オプション> 61歳以上
    </選択>
    <P>コメントを入力してください:
    <input name="名前" size=40 maxlength=100>
    <P>
    <INPUT TYPE=送信値="送信">
    <INPUT TYPE=リセット値="リセット">
    </FORM>
  </body>
</html>

このフォームで参照される CGI スクリプトは、フォームを送信した読者の名前、年齢、性別、コメントという 4 つの異なるデータを受け取ります。スクリプトは 4 つの値を解析し、すべての文字変換を処理する必要があります。 https://www.computerbasic.click/survey.c という別のファイルを使用して、スクリプトSurvey.cgiを作成しました。その長さはおそらく 100 行です。

まとめ

CGI スクリプトのこのクイック ツアーでは、次のことがわかりました。

  • CGI スクリプトはプログラムです。通常は C プログラムまたは PERL スクリプトです。
  • ほとんどのサーバーでは、CGI スクリプトはcgi-binという名前のディレクトリに存在します。スクリプトは、ブラウザによってスクリプトの URL が要求されたときに実行されます。
  • スクリプトが STDOUT に送信するものはすべてブラウザーに送信されます。文字列「Content-type: text/html\n\n」が最初に送信される必要があります。その後は何でもありです。ただし、通常は、有効な HTML ドキュメントの有効な HTML タグが送信されます。
  • 入力は、ACTION でスクリプトの URL を指定する HTML フォームを作成することによってスクリプトに送信されます。
  • スクリプトはフォームからデータを受け取ると、さまざまな文字列を解析して、変更されたすべての文字を変換する必要があります。これらのタスクを実行できる単純な C プログラムを見てきました。 PERL 用の CGI ライブラリ (次のページを参照) を使用すると、PERL スクリプトへの変換が簡単になります。

これを実際の Web サイトで行う場合は、通常、各調査の結果をテキスト ファイルまたはデータベースに保存して、後で結果を確認できるようにします。これは、C プログラムまたは PERL スクリプトから簡単に実行できます。

詳細については、以下のリンクをご覧ください。