Next: 16.3 ISINDEXの解析
Up: 16. フォーム
Previous: 16.1 フォーム環境
前述したように、フォームに入力された情報は、formタグのactionアトリビュートで指定したURIに送られます。URIにmailto形式を使うことでメールを特定のアドレスに送ることもありますが、CGIプログラムのURIを指定して適切な処理を行うのが普通です。CGIプログラムで標準出力に出力したコンテンツがブラウザに送られます。
CGIを経由してデータを送る際には、一部の文字はURIの仕様に従ってエンコーディングされます。
- 1バイトで表される31a〜z、A〜Z、0〜9の文字はそのままとおします。
- 文字コード00〜1F(16進数値)と7Fは、そのまま使うことはできないので、%文字コードの16進表記として表します。たとえば%7fのようになります。16進表記のときの大文字、小文字は関係ありません。
- -、@、*、.、_の文字はそのままとおします。
- スペース文字は+に変換されます。
- これら以外の文字はすべて、%文字コードの16進表記として表します。
日本語の文字コードには、EUC-JP、JIS、ShiftJISの3種類がありますが、どの文字コードが使われるかは、ブラウザによるようです。Netscape Navigator/Communicatorではフォームの送信元のファイルの文字コードと同じものが使われます。Lynxではファイルの文字コードに関係なく、すべてEUC-JPが使われます。このため、受けたデータに日本語が入っている可能性があるなら、CGIプログラム側で特定の文字コードに変換する必要があるでしょう。
エンコードしたデータは、formタグのmethodアトリビュートの値がgetのときには、環境変数QUERY_STRINGに入ります。postのときには、標準入力に入り、環境変数CONTENT_LENGTHにその大きさがバイト単位で入ります。
CGIプログラムにはPerlが多く使われます32。Perlは、テキストの入力データを加工し出力することを得意としています。CGIプログラムの役目はまさにこれです。PerlはUNIX用の言語実行環境ですが、WindowsやMacintoshにも移植されています。Perlにはさまざまな追加モジュールが提供されていますが、CGIの処理を簡単にするものもいろいろ用意されています。本ドキュメントではCGI.pmというモジュールを使うことにします。Perlの細かな言語仕様などについてはここでは紹介しません。
次のPerlスクリプトは、フォームのページで記載したnameとemailの変数の値を表示するCGIプログラムです。行番号は説明のための便宜的なものなので、実際のプログラムスクリプトには入っていません。このスクリプトはUNIX用のものですが、Windowsでも同様に動作するでしょう。UNIXの場合には、chmod a+x ファイル名を実行して、実行属性を付ける必要があります。
1:#!/usr/bin/perl
2:use CGI;
3:$query = new CGI;
4:print <<EOF
5:Content-type:text/html
6:
7:<html>
8: <head>
9: <title>送信結果</title>
10: </head>
11: <body>
12: <h1>送信結果</h1>
13: <ul>
14:EOF
15: ;
16:
17:print " <li>" . $query->param('name') . "</li>\n";
18:print " <li>" . $query->param('email') . "</li>\n";
19:
20:print <<EOF
21: </ul>
22: </body>
23:</html>
24:EOF
25: ;
- 1行目の#!/usr/bin/perlは、Perlのパス名を示しています。環境によっては#!/usr/local/bin/perlなどになるでしょう。
- 2行目のuse CGIはCGI.pmモジュールを使うことを宣言しています。
- 3行目の$query = new CGIは、新しいオブジェクトを生成しています。フォームから送られたデータはすべてこのオブジェクト$queryから取得できます。CGI.pmモジュールは、methodがgetかpostかを自動的に判断するので、開発者は気にする必要はありません。
- 4〜15行目は、ブラウザに出力するHTMLコンテンツです。5〜6行目に注目してください。Content-type: text/htmlは、出力するコンテンツのMIMEタイプを指定しています。この行の後には必ず空行が入ります(6行目)。
- 17〜18行目でフォームの入力値を表示します。$query->param('変数名')でフォームの変数の値を取得することができます。
- 20〜25行目は、HTMLの後始末をするコンテンツです。
CGI.pmは、エンコーディングされたデータを復元するため、処理する際にエンコードを気にする必要はありません。ちなみに次のようなPerlスクリプトでも復元することが可能です。
s/\+/ /g;
s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
変数の値に日本語文字コードが含まれるときには、文字コードをCGIプログラムで扱いやすいものに統一する必要があるでしょう。UNIXであればEUC-JP、WindowsであればShiftJISに統一することになるでしょう。Perlでは、jcode.plというライブラリファイルがよく使われているようです。
Webサーバーによっては、CGIプログラムは特定のディレクトリ下にあるときのみ使用可能になっていることがあります。
CGIプログラムに渡される環境変数の代表的なものとして、次のようなものがあります。Webサーバーの種類や設定によってほかにも渡されることがあります。
- AUTH_TYPE
- ユーザー認証機能のプロトコル名が入ります。
- CONTENT_LENGTH
- フォームの形式がpostのときに入力データのバイト数が入ります。
- CONTENT_TYPE
- データのMIMEタイプが入ります。通常、application/x-www-form-urlencodedです。
- DOCUMENT_ROOT
- 仮想パスのルートディレクトリに当たるローカルパスが入ります(たとえば/usr/local/etc/httpd/htdocs/)。
- GATEWAY_INTERFACE
- CGI/1.1などのCGIのバージョンを示します。
- HTTP_ACCEPT
- ブラウザが受け付けることができるMIMEタイプのリストが入ります。
- HTTP_ACCEPT_CHARSET
- ブラウザが受け付け可能な言語セットのリストが入ります。
- HTTP_ACCEPT_LANGUAGE
- ブラウザが表現できる言語コードのリストが入ります。
- HTTP_CONNECTION
- httpの接続方式を示します。
- HTTP_HOST
- Webサーバーの完全修飾ドメイン名またはIPアドレスが入ります。
- HTTP_PRAGMA
- キャッシュの制御を行います。no-cacheが値の場合、キャッシュを行いません。
- HTTP_REFERER
- CGIプログラムを実行したURIが入ります。
- HTTP_USER_AGENT
- ブラウザの名前やバージョンなどの情報が入ります。
- QUERY_STRING
- フォームの形式がgetのときに入力データが入ります。
- REMOTE_ADDR
- ブラウザを実行しているホストのIPアドレスが入ります。
- REMOTE_HOST
- ブラウザを実行しているホストの完全修飾ドメイン名が入ります。
- REQUEST_METHOD
- フォームの形式(GETまたはPOST)が入ります。
- SCRIPT_FILENAME
- CGIプログラムのローカルパス名が入ります(たとえば/usr/local/etc/httpd/cgi-bin/test.cgi)。
- SCRIPT_NAME
- CGIプログラムの仮想パス名が入ります(たとえば/cgi-bin/test.cgi)。
- SERVER_ADMIN
- Webサーバーの管理者の連絡先が入ります。
- SERVER_NAME
- Webサーバーの完全修飾ドメイン名またはIPアドレスが入ります。
- SERVER_PORT
- Webサーバーの接続ポート番号が入ります。
- SERVER_PROTOCOL
- httpプロトコルのバージョンが入ります(たとえばHTTP/1.0)。
- SERVER_SOFTWARE
- Webサーバーソフトウェアの名前やバージョンが入ります。
Kenshi Muto
平成11年9月19日