前回の講義ではCGIプログラムの機能について紹介しました。 今日はパート 2、CGI プログラミングの概念に入ります。この講義の内容は、CGI プログラムを深く理解するための基礎となります。
この一連の講義では、Delphi を使用して CGI プログラムを作成します。この内容では、この講義は必要ないと思われるかもしれません。 しかし、CGI の利点の 1 つは、利用可能な開発言語が豊富であること (この問題については後述します) と、この講義の内容がどのプログラミング言語 (Delphi も含む) で使用できることであると思います。 したがって、CGI を活用するには、やはりこの講義の内容が必要であり、また、この講義の内容は CGI プログラムを深く理解するための基礎となります。
2.CGI仕様:
通常、WEB サーバーは強力なコンピューターですが、すべての処理能力を利用することは不可能です。 CGI の出現により、WEB サーバーの処理能力を利用して、興味深い動的なコンテンツをリモート クライアントに提供できるようになりました。 CGI 仕様は、WEB サーバーと WEB 上で実行されるアプリケーションに適用されます。 これは HTTP プロトコルの一部ではありませんが、NCSA httpd、CERN httpd、Apache httpd、IIS、および私たちが使用する OmniHTTPD など、ほとんどの WEB サーバーがこの仕様をサポートしています。
2.1、CGIの概要
CGI は、WEB サーバー、ブラウザ、アプリケーション間の相互運用において従う一連のルールを定義します。 たとえば、WEB ブラウザを通じてリモート データベース システムにクエリを実行します。
2.2. 言語:
CGI プログラムは、WEB サーバー上で実行できる任意の言語で作成できます。 最も使い慣れており、現在の仕事に最適な言語を選択する必要があります。 たとえば、Perl 言語は文字列とファイルの処理に適しており、C は大規模で複雑なプログラムに適しており、Visual Basic と Delphi はデータベース処理に適しています。 一般的に使用される CGI プログラミング言語は次のとおりです。
C
C++
パール
Tcl
パイソン
シェルスクリプト
ビジュアルベーシック
デルフィ
アップルスクリプト
2.3、CGI方式:
CGIを呼び出す方法をCGIメソッドと呼びます。 主な CGI メソッドは次の 3 つです。
2.3.1、GETメソッド:
GET メソッドは、ブラウザが WEB サーバーにリクエストを行うために使用するメソッドです。 このメソッドを使用すると、CGI プログラムは環境変数 QUERY_STRING からデータを取得します。入力パラメータを取得するには、CGI プログラムはこの環境変数を分析する必要があります。 送信するデータが非常に長い場合は、POST メソッドを使用する必要があります。
2.3.2、POSTメソッド:
POST メソッドを使用する場合、CGI プログラムは stdin (標準入力) から入力データを取得します。 入力データの末尾には EOF (End Of File) がないため、CGI プログラムは入力データを正しく読み取るために環境変数 CONTENT_LENGTH 値を使用する必要があります。 GET メソッドでは URL の長さの制限 (通常は 1024 バイト以下) により大量のデータを送信できないのに対し、このメソッドを使用する最大の利点は、大量のデータを送信できることです。 現時点では、POST メソッドが唯一のオプションです。
2.3.3、HEADメソッド:
HEADメソッドは基本的にGETメソッドと同じですが、WEBサーバーからブラウザにデータを送信する点が異なります。 また、HTTPヘッダ情報のみが送信されます。
2.4. インターフェース仕様:
ここでは、WEB サーバーが CGI プログラムと通信するための 4 つの主な方法 (環境変数、コマンド ライン、標準入力、標準出力) を紹介します。 (CGI バージョン 1.1 に基づく)
2.4.1. 環境変数:
AUTH_TYPE: サーバーが確認応答をサポートし、スクリプトが保護されている場合、確認応答のタイプを示します。
CONTENT_LENGTH: POST メソッドを使用して送信されるデータの長さをバイト単位で示します。 GET メソッドを使用する場合、変数は空です。
CONTENT_TYPE: POST メソッドを使用するときに送信されるデータの MINE タイプを示します。 GET メソッドを使用する場合、変数は空です。 例: application/x-www-form-urlencoded。
GETWAY_INTERFACE: CGI 仕様の名前とバージョン番号を指定します (CGI/1.1 など)。
PATH_INFO: URL 内の CGI プログラム名の後に追加のパス情報を提供します。
PATH_TRANSLATED: CGI プログラムの物理パス (通常は WEB ルート ディレクトリ、スクリプト名、および追加のパス情報)。
QUERY_STRING: URL の「?」文字以降の情報。 この環境変数は、GET メソッドを使用するときに入力データを提供します。
REMOTE_ADDR: 要求を行っているリモート コンピューターの IP。
REMOTE_HOST: 要求を行っているリモート コンピューターの名前。
REMOTE_IDENT: RFC 931 で定義されたユーザー名を与えます。
注: RFC 931 は、TCP 接続におけるユーザーの身元を確認する方法を説明するインターネットの信頼できる文書です。 ドキュメントは http://sunsite.auc.dk/RFC/rfc/rfc931.html にあります。
REMOTE_USER: リクエストを行っているクライアントの許可されたユーザー名を指定します。
REQUEST_METHOD: リクエストを行うメソッド。GET、HEAD、POST のいずれかです。
SCRIPT_NAME: CGI プログラムを実行するための仮想パス (/cgi-bin/query.cgi など)。
SERVER_NAME: WEB サーバー ソフトウェアを実行しているコンピューターのドメイン名または IP アドレス (www.chinabyte.com など)。
SERVER_PORT: WEB サーバーのポート番号。デフォルト値は 80 です。
SERVER_PROTOCOL: WEB サーバーで使用されるプロトコル名とバージョン番号 (HTTPD/1.0 など)。
SERVER_SOFTWARE: CGI プログラムを実行する WEB サーバーの名前。 形式は「サーバー名/バージョン番号」です (例: NCSA/1.5b5)。
HTTP_ACCEPT: クライアントによって送信される「Accpect: ヘッダー行」。クライアントが処理できる MIME タイプに対応し、「タイプ/サブタイプ、タイプ/サブタイプなど」の形式 (*/*、image/ など)。 gif、画像/jpeg。
HTTP_REFERER: はい リファラー: CGI リクエストを行うときのフォーム (Form) の URL を含むヘッダー行のディレクトリ (http://www.chinabyte.com/register.form など)。
HTTP_USER_AGENT: リクエストを行ったクライアント ブラウザの名前 (例: Mozilla/1.2N (Windows;I;32bit))。
上記の環境変数は、前の講義のデモ プログラムを使用して確認できます。
2.4.2、コマンドライン:
CGI コマンド ラインは、ISINDEX でクエリを実行する場合にのみ使用されます。 ISINDEX クエリは、<ISINDEX> と <BASE HREP=".."> で囲まれた特別なクエリです。 コマンドラインには複数のパラメータを指定できます。
2.4.3. 標準入力:
POST メソッドを使用する場合、CGI プログラムは送信されたデータを標準入力から取得します。 前述したように、CONTENT_TYPE および CONTENT_LENGTH 環境変数値を使用する必要があります。 注意すべき点は、スペースがプラス記号に置き換えられたり、~ が %7E に置き換えられたりするなど、データ内の URL がエンコードされていることです。
2.4.4. 標準出力:
CGI プログラムは、標準出力、または WEB サーバーが解釈できるコマンドを通じてブラウザにデータを送信します。 CGI プログラムは WEB サーバーを介してブラウザと通信できます。そのプログラム名は、未分析のヘッダー情報を表す「nph-」で始まる必要があります。 CGI プログラムは、ブラウザに返される HTTP ヘッダー情報の正確性を保証します。
nph プログラムを使用しない場合、サーバーは CGI が返す可能性のある 3 つの特別なヘッダーを探します。
Content-type: MIME タイプのヘッダー情報。たとえば、HTML を入力する場合、「Content-type:text/html」がよく使用されます。
場所: 別のドキュメントを指していることをサーバーに伝えます。 サーバーは、URL が完全パスであるか相対パスであるかに応じて、クライアントをリダイレクトするか、ドキュメントのコンテンツを送信します。
ステータス: サーバーからクライアントに送信されるステータス行。 形式は次のとおりです: nnnXXXXX、nnn は 3 桁のコード、XXXXX は対応する説明テキストです。