CGI出力内容

戻る

CGIからの出力内容(つまり、標準出力へ送る文字列)は、単なるHTML記述だけではない。メッセージヘッダを含まなければならない。そうは言ってもそれほど面倒なことでもないので、決まり事として捉えておけば良いだろう。ヘッダには、ステータスやクッキーなどが含まれ、空行(CRLFのみの行)で区切られて、HTML本文(つまり、>HTML<〜>/HTML<)がその後ろに続くものとなる。(エラーの時はHTML本文を省略しても良い)

プログラムが正常に機能し、正しくHTMLページを戻す場合と、そうではない場合はヘッダを変えることになる。プログラムによるが、全てのヘッダを覚え、対応しなければならないとは限らない。通常のプログラムを組む場合に必要となるであろうステータスはおおよそ下記であろう。(これ以外は RFC-2068 で確認されたい)


正常終了

このヘッダ部に続き、HTMLを送出する

HTTP/1.1 200 OK
content-type:text/html

プログラムエラー時

このヘッダ部に続き、エラーメッセージのHTMLを送出する

HTTP/1.1 500 Internal Error
content-type:text/html

アクセス禁止

リクエスト内容へのアクセスを禁止している場合

HTTP/1.1 403 Forbidden

リダイレクト

別のページへすぐにジャンプさせたい時

HTTP/1.1 303 See Other
Location: http://tokyo.cool.ne.jp/taquino/

繰り返しになるが、どういうCGIを作成するかによって、戻さねばならないステータスが変わってくる。通常のCGIならば正常終了のみを考えておけば良いだろうが、御礼ページを出すだけのような時は「リダイレクト」を返す手もあるわけだ。正常終了だけではなく、プログラムエラーに備えるために、エラートラップ(On Error Goto 〜)を用いて、内部エラー発生時にエラーヘッダ(上記の Internal Error)を戻す準備も必要である。アクセス権の設定によっては、CGIプログラムがサーバ内のファイルを扱えないこともあるので、アクセス禁止も考慮しておきたいところ。ところで、サーバによってはステータスヘッダを適宜付けてくれるようで、「content-type:〜」の行のみを戻せば良いようだが、ここはやはり付けるようにしておきたい。

ヘッダ部に日付と時刻を入れる場合、この書式は決まっている。書式に沿った文字列を返す関数を作成しておくと良いだろう。プログラム例は下記の通りとなる。ここでは、国際標準時からの時差9時間を考慮している。


WWW用の日付を戻す関数


Function GMT_Date(T As Variant) As String
    Dim GMT As Variant
    GMT = DateAdd( "h ", -9, T)
    GMT_Date = Format$(GMT, "ddd dd mmm yyyy hh:mm:ss ") &  " GMT"
End Function

ヘッダ部にメッセージ作成の日時を盛り込む場合は、「Date: HTTP-date」とする。その他ヘッダ中に含むことが出来る(本来は含むべき)ものとしては、「From: Mail-address」などもある。これらは通常、ブラウザ上で見ることは出来ない情報なので、RFCなどで確認することになる。

ヘッダ部に盛り込めるものとして、クッキー(Cookie)というものがある。クライアント側にパラメータを渡しておき、アクセスの度にこれをクライアント側から提示させる仕組である。ユーザが同じCGIを再訪する場合に、前回の状況を保持しておける、と考えておけば良いだろう。ユーザ側はセキュリティ問題を意識することにもなるが、実のところ便利な機能なので、使用方法は覚えておきたい。ごく単純なクッキー情報としては、「名前」と「値」をイコールで結んだものとなる。有効範囲や有効期限も付けられる。詳細の説明は Netscape のホームページで詳細を確認することが出来る。クッキーに関しては、筆者は積極的に使うべきではないかと考えている。一時期セキュリティが問題となり、クライアント情報がサーバ側に漏れる心配がされていたが、ブラウザの実装に問題があったようだ。

クッキー文字列も、名前、値、有効期限、有効範囲(パス)を引数にし、文字列を返す関数にしてしまうと便利と思われる。例えば、下記のようなプログラムになる。(なお、クッキーの制限値は、30個まで、各4Kバイトまで)


クッキー設定用文字列作成関数


Public Function Cookie_String(C_NAME As String, C_VALUE As String, C_PATH As String, C_DAYS As Integer)
    Dim C_EXPIRES As String
    Cookie_String = "Set-Cookie: " & C_NAME & "=" & C_VALUE
    If C_PATH <> "" Then
        Cookie_String = Cookie_String & "; path=" & C_PATH
    End If
    If C_DAYS > 0 Then
        Cookie_String = Cookie_String & "; expires=" & GMT_Date(DateAdd("d", C_DAYS, Now()))
    End If
End Sub

ヘッダ情報を忘れるとどうなるかと言うと、結構ちゃんと表示できちゃったりもする。できたとしても、ブラウザが気を利かして表示してくれているだけなので、それで良いわけではない。少なくとも、正常終了のステータスを付けて戻すようにしなければならない。なお、カウンターのように、CGIからイメージ情報を戻す場合などは、「content-type」を適切に変更することになる。