CGIスクリプトの実行結果(出力)の1行目は次の形式のいずれかにしてください。
Content-type: TypeName 最もよく使われる形式です。TypeNameにはMIMEタイプと呼ばれる名前を指定します。MIMEタイプには次のようなものがあります。
- text/html ... HTML文書
- text/plain ... べた文書
- image/gif ... GIFファイル
- image/jpeg ... JPEGファイル
- video/mpeg ... MPEGファイル
通常のテキストを表示する場合は、Microsoft Internet Explorer 3.0では、text/plain をうまく解釈できないことがありますので、text/htmlとしたほうが無難なようです。
Location: UrlName 指定したURLにジャンプします。URLを http:// ではじまる完全URLで指定してください。 (例) #!/usr/local/bin/perl print "Location: http://xxx.yyy.zzz/\n"; print "\n";
Status: StatusCode ブラウザに状態コードを返します。詳細はHTTPの仕様書を参照してください。 出力の2行目(正確に言うと、ヘッダ情報が完了した次の行)は必ず空白行にしてください。これを怠ると、CGIスクリプトは動作しません。
CGIスクリプトにパラメータを渡すには以下のような方法があります。コマンドライン引数で渡す: 以下のような形式でCGIスクリプトを呼び出すことにより渡します。引数1、引数2がCGIスクリプトのコマンドライン引数になります。チルダ(~)やクォーテーション(")や日本語などは %nn 形式に変換(エンコード)してから渡してやる必要があります。
http://...../cgi-bin/xxx.cgi?引数1+引数2METHOD=GETで渡す: 次のような形式でCGIスクリプトに渡します。CGIスクリプトは、これを環境変数の QUERY_STRING から読み出します。フォームから METHOD=GET で呼び出した場合も、この形式でデータが渡されますが、環境変数のサイズには上限があるので、大きなデータを転送する時は METHOD=POST を用いましょう。
http://...../cgi-bin/xxx.cgi?名前1=値1&名前2=値2URLにスラッシュ(/)をつけて渡す: 以下のような形式でCGIスクリプトを呼び出すこともできるそうなのですが、私が使っているサーバーではうまくいかないようです。環境変数PATH_INFOなどを用いて引数を読み取るそうです。
http://...../cgi-bin/xxx.cgi/引数1/引数2/METHOD=POSTで渡す: フォームから METHOD=POST で呼び出した場合は、データはURLではなく、標準入出力で渡されます。CGIスクリプトは、これを環境変数の CONTENT_LENGTH 分、標準入力から読み出します。
CGIスクリプトに渡すデータは、次のような規則にしたがってエンコード(符号化)しなくてはなりません。(フォームの場合はブラウザが自動的にエンコードしてくれます。) これを怠ると、~ が \~ に変換されてしまったり、日本語が化けてしまったりします。CGIスクリプトの中では、これを適切な手段でデコードしてやらなくてはなりません。例えば、perlによるCGIスクリプトでは、次のようなコードでデータをデコードします。
- スペースはプラス(+)に置き換える。
- 特殊文字、日本語などはパーセント(%)に続く2桁の16進数に置き換える。
$value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
CGIスクリプトの中では次の環境変数を使用することができます。(ABC順)
変数名 意味 AUTH_TYPE 認証方式(例えば MD5, Basicなど) CONTENT_LENGTH 標準入力から読み込み可能なデータのバイト数(METHOD=POSTの時) CONTENT_TYPE クライアントから送られてきたデータのタイプ。フォームからMETHOD=POSTで送信した場合は、application/ x-www- form- urlencoded となる。 GATEWAY_INTERFACE ゲートウェイプロトコル名称(例えばCGI/1.1) HTTP_ACCEPT ブラウザがサポートする Content-type: のリスト。すべてを許可する場合、*/* となる。 HTTP_FORWARDED この要求をフォワードしたプロキシサーバーの情報。送信されない場合もある。 HTTP_REFERER ブラウザで直前に参照していたURL。送信されない場合や、たまに、全く別のURLを差していることもある。 HTTP_USER_AGENT ブラウザに関する情報(Mozilla/4.01 [ja] (Win95; I) など) HTTP_X_FORWARDED_FOR この要求をフォワードしたプロキシサーバーのIPアドレス。 PATH_INFO パス情報。たとえば、「cgi-bin/xxx.cgi/taro/xxx.htm」というURLでCGIスクリプトを呼び出した場合、PATH_INFOには「/taro/xxx.htm」が格納される。 PATH_TRANSLATED PATH_INFOで指定したファイルの、サーバー上の絶対パス名。 QUERY_STRING 「http://サーバー名/CGIスクリプト名?データ」というURLを要求した場合のデータ部分。 REMOTE_ADDR クライアントのIPアドレス(例えば10.0.0.1) REMOTE_HOST クライアントのホスト名(例えば abc32.abc.co.jp) REMOTE_IDENT クライアント側のユーザーID REMOTE_USER クライアント側のユーザー名 REQUEST_METHOD METHODで指定したデータ取得手段。GET, POST, HEAD, PUT, DELETE, LINK, UNLINKなどの種類がある。 SCRIPT_NAME CGIスクリプトの名前。 SERVER_NAME サーバー名 SERVER_PORT サーバーのポート番号(例えば80) SERVER_PROTOCOL サーバーのプロトコル名(例えばHTTP/1.0) SERVER_SOFTWARE サーバーのソフトウェア名(例えば NCSA/1.3)