C++ CGIプログラミング入門:Webアプリケーション開発の基礎
CGIとは?
Common Gateway Interface(CGI)は、Webサーバーとカスタムスクリプト間で情報を交換する方法を定義する一連の標準規格です。
- CGI仕様は現在NCSAによって維持されています
- CGIは、HTTPサーバーなどの情報サーバーとインターフェースする外部ゲートウェイプログラムの標準です
- 現在のバージョンはCGI/1.1で、CGI/1.2が進行中です
Webブラウジングの仕組み
ハイパーリンクをクリックして特定のWebページやURLを閲覧するとき、以下の流れで処理されます。
- ブラウザがHTTP Webサーバーに接続し、URL(ファイル名)を要求
- WebサーバーがURLを解析し、ファイルを検索。見つかればファイルを返し、見つからなければエラーメッセージを返す
- ブラウザがレスポンスを受け取り、ファイルまたはエラーメッセージを表示
ただし、HTTPサーバーを設定して、特定のディレクトリのファイルが要求されたときにファイルを返す代わりにプログラムとして実行し、その出力をブラウザに返すようにできます。これがCGIの基本概念です。
Webサーバーの設定
CGIプログラミングを始める前に、WebサーバーがCGIをサポートし、CGIプログラムを処理するように設定されていることを確認してください。HTTPサーバーで実行されるすべてのCGIプログラムは、事前設定されたディレクトリ(CGIディレクトリ)に置かれます。慣例として/var/www/cgi-binという名前が使われ、CGIファイルの拡張子は慣例として.cgiです(C++実行ファイルであっても)。
Apache Webサーバーはデフォルトで/var/www/cgi-binのCGIプログラムを実行するように設定されています。他のディレクトリを指定する場合はhttpd.confを修正します。
最初のCGIプログラム
以下のC++プログラムを考えます。
#include <iostream>
using namespace std;
int main() {
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Hello World - First CGI Program</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<h2>Hello World! This is my first CGI program</h2>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
このコードをコンパイルし、実行ファイル名をcplusplus.cgiとして/var/www/cgi-binディレクトリに配置します。実行前にchmod 755 cplusplus.cgiで実行権限を付与してください。
重要なポイントは最初の行でContent-type:text/html\r\n\r\nを出力していることです。これはブラウザにコンテンツタイプを伝えるHTTPヘッダーの一部です。
HTTPヘッダー
Content-type:text/html\r\n\r\nはHTTPヘッダーの一部で、ブラウザがコンテンツを理解するために送信されます。主なHTTPヘッダーには以下があります。
| 番号 | ヘッダーと説明 |
|---|---|
| 1 | Content-type: 返されるファイルの形式を定義するMIME文字列(例: text/html) |
| 2 | Expires: 情報が無効になる日付。ブラウザがページ更新の判断に使用 |
| 3 | Location: リダイレクト先のURL |
| 4 | Last-modified: リソースの最終更新日 |
| 5 | Content-length: 返されるデータのバイト数 |
| 6 | Set-Cookie: クッキーを設定 |
CGI環境変数
CGIプログラムは以下の環境変数にアクセスできます。これらはCGIプログラム作成時に重要な役割を果たします。
| 番号 | 変数名と説明 |
|---|---|
| 1 | CONTENT_TYPE クライアントが送信するコンテンツのデータタイプ(ファイルアップロードなど) |
| 2 | CONTENT_LENGTH POSTリクエストで利用可能なクエリ情報の長さ |
| 3 | HTTP_COOKIE 設定されているクッキーのキーと値の組み合わせ |
| 4 | HTTP_USER_AGENT リクエストを送信したユーザーエージェント(ブラウザ名)の情報 |
| 5 | PATH_INFO CGIスクリプトのパス |
| 6 | QUERY_STRING GETメソッドで送信されるURLエンコードされた情報 |
| 7 | REMOTE_ADDR リクエストを送信したリモートホストのIPアドレス |
| 8 | REMOTE_HOST リクエストを送信したホストの完全修飾名 |
| 9 | REQUEST_METHOD リクエストに使用されたメソッド(GET、POSTなど) |
| 10 | SCRIPT_FILENAME CGIスクリプトのフルパス |
| 11 | SCRIPT_NAME CGIスクリプトの名前 |
| 12 | SERVER_NAME サーバーのホスト名またはIPアドレス |
| 13 | SERVER_SOFTWARE サーバーが実行しているソフトウェアの名前とバージョン |
C++ CGIライブラリ
実際のアプリケーションでは、GNU cgiccライブラリを使用すると便利です。インストール手順:
$ tar xzf cgicc-X.X.X.tar.gz $ cd cgicc-X.X.X/ $ ./configure --prefix=/usr $ make $ make install
GETとPOSTメソッド
ブラウザからWebサーバー、そしてCGIプログラムへ情報を渡すには、主にGETメソッドとPOSTメソッドの2つがあります。
GETメソッド
エンコードされたユーザー情報をページリクエストに追加して送信します。ページと情報は?文字で区切られます。
https://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
GETはデフォルトメソッドですが、パスワードなど機密情報には使用しないでください。また、リクエスト文字列は最大1024文字までという制限があります。情報はQUERY_STRING環境変数でアクセスできます。
POSTメソッド
情報を別メッセージとして送信するため、より信頼性が高い方法です。標準入力としてCGIスクリプトに渡されます。同じCGIプログラムでGETとPOSTの両方を処理できます。
フォームデータの処理例
チェックボックス
複数選択が必要な場合に使用します。queryCheckbox()メソッドでチェック状態を取得できます。
ラジオボタン
単一選択の場合に使用します。getElement()で選択された値を取得します。
テキストエリア
複数行のテキストを渡す場合に使用します。
ドロップダウンボックス
多数の選択肢から1つを選ぶ場合に使用します。
CGIでのクッキー使用
HTTPはステートレスプロトコルですが、商用サイトではページ間でセッション情報を維持する必要があります。クッキーは訪問者の設定、購入履歴、手数料などを記憶・追跡する効率的な方法です。
クッキーの仕組み
サーバーがブラウザにクッキーとしてデータを送信し、ブラウザが受け入れると訪問者のハードドライブにプレーンテキストとして保存されます。同じサイトの別ページを訪れたとき、クッキーが取得可能になり、サーバーは保存された情報を知ることができます。
クッキーは5つの可変長フィールドで構成されます:
- Expires - クッキーの有効期限。空白ならブラウザ終了時に期限切れ
- Domain - サイトのドメイン名
- Path - クッキーを設定したディレクトリやページのパス
- Secure - "secure"が含まれる場合、セキュアサーバーでのみ取得可能
- Name = Value - キーと値の組み合わせで設定・取得
クッキーの設定
#include <iostream>
using namespace std;
int main() {
cout << "Set-Cookie:UserID = XYZ;\r\n";
cout << "Set-Cookie:Password = XYZ123;\r\n";
cout << "Set-Cookie:Domain = www.example.com;\r\n";
cout << "Set-Cookie:Path = /perl;\n";
cout << "Content-type:text/html\r\n\r\n";
cout << "<html><head><title>Cookies in CGI</title></head><body>";
cout << "Setting cookies" << endl;
cout << "</body></html>\n";
return 0;
}
クッキーはContent-typeヘッダーの前にSet-Cookieヘッダーで設定します。
クッキーの取得
クッキーはHTTP_COOKIE環境変数にkey1=value1; key2=value2; ...の形式で格納されます。cgiccライブラリのgetCookieList()で取得できます。
ファイルアップロード
ファイルをアップロードするには、HTMLフォームにenctype="multipart/form-data"を指定し、input type="file"で「参照」ボタンを作成します。CGI側ではgetFile()でファイルを取得し、writeToStream()で保存できます。
C言語
- C#名前空間完全ガイド:構成、スコープ、ベストプラクティス
- C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
- C++コメント完全ガイド:読みやすく保守しやすいコードのためのベストプラクティス
- C++配列を関数に渡す完全ガイド:1次元・多次元配列の実例付き
- Cプログラミング入門:初心者向け包括チュートリアル
- C++プログラミング言語:概要と主要機能
- C++定数とリテラル完全解説:型、構文、ベストプラクティス
- C++演算子完全ガイド:種類、使い方、ベストプラクティス
- C++数値型完全ガイド:実践的な使い方と数学関数
- C++リファレンス完全理解:重要概念とポインタとの違い
- C++テンプレート完全ガイド:ジェネリックプログラミングの基礎