前へ << GET と POST | パーミッションと実行権限 >> 次へ |
これまでの CGI プログラムで解説したように、 「Content-type: text/html\n」というのがヘッダです。1: #!/usr/local/bin/perl 2: 3: print "Content-type: text/html\n\n"; 4: 5: print "<html><body>"; 6: print "Hello world."; 7: print "</body></html>";の例で言うと、まずヘッダ「Content-type: text/plain\n」を出力します。 そして、改行 `\n' を出力します。これはヘッダではありません。 ヘッダの終了を表す空行です。 その後にボディが続きます。つまり、CGI プログラムは
ヘッダ (空行=改行のみの行) ボディ…という出力をしなければいけない、ということです。Content-type は必須のヘッダで、後に続くボディが どのような内容なのかを表します。以下はあくまでも一例です。
これらは IANA (Internet Assigned Numbers Authority) という機関が管理しています。 新しくファイルの種類を作った場合は、IANA に登録しておくとよいでしょう。
- Content-type: text/html … HTML
- Content-type: text/plain … プレインテキスト
- Content-type: image/gif … GIF 画像
- Content-type: image/jpeg … JPEG 画像
ただし Content-type は、ブラウザ側が解釈するものです。
ヘッダには Content-type 以外にもたくさんの種類があり、 同時に複数のヘッダを出力することができます。 複数のヘッダを出力する場合は、ヘッダ1 ヘッダ2 ヘッダ3 … ヘッダn (空行=改行のみの行) ボディ…という形になります。世の中の CGI プログラムを見渡してみると、 大抵 Content-type ヘッダしか出力していません。 CGI プログラムの性格によってはそれでも構わないのですが、 掲示板のようなものは、できるだけ Content-length ヘッダと Last-Modified ヘッダ を出力すべきです。
Content-length は、データの長さがどれだけかを表します。 ブラウザで読み込み途中に「45% 読み込み」や「あと xx 秒」という表示を 見たことがあるでしょうが、Content-length ヘッダを出力しないと これらの情報は表示されません。 結果的に、Content-length ヘッダを出力することで、 読み込み時のユーザの体感時間を減少させることができます。しかし、CGI プログラムは動的に内容を変更するものなので、 ボディを出力する前にボディの長さを知るのは困難です。
Last-Modified ヘッダとは、最終更新時刻のことです。 時刻の形式はいくつか種類がありますが、Last-Modified: Mon, 06 May 1996 04:12:35 GMTという形式が最も一般的です。 これを出力すると、転送量が大きく減少します。 なぜなら Last-Modified ヘッダを受け取ったブラウザは、 次回同じページにアクセスしたときに、 If-Modified-Since というリクエストヘッダを送ります。
ヘッダ名は case-insensitive です。 つまり、大文字小文字は区別されません。コンピュータ業界では、大文字小文字を区別しないことを case-insensitive、 逆に大文字小文字を区別することを case-sensitive と言います (一般的な英語なのかなぁ?)。ですから、Content-type、Content-Type、CONTENT-type、CoNtEnT-tYpE は 全て同じ意味です。 ただし過去のブラウザでは Content-type でないとダメ、というバグがありました。 ヘッダを解釈するのはブラウザであることを考えると、 あまり CoNtEnT-tYpE のような奇抜なヘッダ名は使わない方がよいでしょう。
前へ << GET と POST | パーミッションと実行権限 >> 次へ |