特殊なヘッダー命令

■ Location

Browserに他ページをアクセスさせるHTTP-Headerです。
イメージマップのところでも説明しましたが、CGIの一番最初の出力で

printf("Location: http://www.hongo.ecc.u-tokyo.ac.jp/index.html\n\n");

と、Location: 絶対URLの行に続いて空行を出力すると、browserはこのCGI とのコンタクトを中止して指定されたURLのページをアクセスする作業に 移ります。つまり閲覧者から見ると、このCGIにアクセスした途端にこの URLのページが表示されるのです。

これの利用例はまさにイメージマップのような使い方ですが、他の利用例 としてはlink先がころころ変わるような機構とか、FORMデータを受理して、 すぐにもとのページに戻らせるような機構の実現のために使われます。


■ Status: 204 No Response

browserの表示を更新させない HTTP-Headerです。
Location HTTP-Headerと同様にCGIの一番最初の出力で

printf("Status: 204 No Response\n\n");

と出力すると、本来ならこのCGIの出力するページに表示が切替わる ところを切替えません。つまりlinkをクリックしても まるで変化しないという機構ができるのです。

この機構は例えば、FORMデータを受け取るCGIで、受理したことを報告する 必要がまるで無い場合に使われるようですが、見る側としてはこれでは 何が起こったのかわからず不安になるのでやめましょう。
それとも極秘にデータを集計する機構に使えるでしょうか。 イメージマップの裏にこれを仕掛けておけば、人がどこを叩くかの集計が 秘密裏に行えます。変な例ですが工夫次第でなにかの役にたつでしょう。


■ Expires, Pragma

Browserにそのページの情報を cacheに保存しないことを指定する HTTP-Headerです。またHTMLタグとして普通のHTMLページで指定することも できます。
HTTP-Headerとして使う場合にはLocation HTTP-Headerなどとは異なり Content-typeの指定行の次の行で指定します。すなわち

printf("Content-type: text/html\n");
printf("Expires: 0\n\n");
または
printf("Content-type: text/html\n");
printf("Pragma: no-cache\n\n");
とします。普通のHTMLページで指定するにはHEADタグ内で
<HEAD>
<META HTTP-EQUIV="Expires" CONTENT="0">
</HEAD>
とすることにより、これらのページの情報は browserのcacheに保存 されません。

ここでcacheの効果についておさらいしましょう。

BrowserはページのURLとその中身をメモリやディスクの中に一時保管 します。その保管領域をcacheと呼びます。特にURLを保管する領域は historyと呼ばれます。そのデータを元に次のような動作をします。

このようにcacheは無駄なアクセスを減らすために使われるのですが CGIへのアクセスに関してはこれがかえって邪魔になります。 CGIはアクセスするたびに変化するページを作るための機構なのですが cacheが働くとアクセスしないで前のデータをそのまま表示するので ページが更新されないのです。

リンクでページを進める場合には、 browserはある程度自動的にページを再アクセスする必要性を判断します。 その判断の基準がどうなっているのか知りませんが、browserの Optionメニューである程度指定できるようです。

以上 cacheの効果の理解を踏まえると、Expires, Pragma HTTP-Header によりcacheに保管されないCGIの性質が理解できます。次のように なります。

これらの性質から、Expires, Pragma HTTP-Headerの使い道は chatなどの更新が頻繁に必要なページや、アクセスカウンタの絵柄 を出力するCGIなどに効果的でしょう。アクセスカウンタでこれを 使うと、Back/Forwordのたびにカウントすることを忘れずに。


■ Refresh

Browserに自動的にページを更新させるHTML Headerタグです。 普通のHTMLページでも使えますし、CGIの出力としても使えます。 次のようにHTMLのHEADタグの内側で使います。

<HEAD>
<META HTTP-EQUIV="Refresh" CONTENT="2">
</HEAD>

このようにHEAD内で宣言すると、このページの表示がされてから CONTENTオプションで指定された秒数の後に このページを再アクセスして表示を更新します。

さらにCONTENTオプションに次のように指定することもできます。

<HEAD>
<META HTTP-EQUIV="Refresh" CONTENT="2; URL=http://www.hongo.ecc.u-tokyo.ac.jp/index.html">
</HEAD>
秒数の指定の後ろにsemicolonとwhite spaceで区切ってURLサブオプション で絶対URLを指定することにより、指定秒数後に指定のURLのページを アクセスして表示します。
これを用いれば、絵本か紙芝居のように自然にページがパラパラと めくられていく時間発展物語性のあるページ群が作れます。

この機構はページを動的なものにしてくれる便利な機能なのですが ページアクセスを連発するとそれだけ browser や network や server に 負担がかかるので、使用はほどほどにしましょう。


■ CHARSET

CGIのコード種をbrowserに教えて、browserに文字化けを起こさせない HTTP-Headerの一部です。Content-typeと同時に次のように出力します。

printf("Content-type: text/html; CHARSET=x-euc-jp\n\n");

これでbrowserはページのコードが日本語EUCコードであると思って 移行の文字データを処理します。

これと似た機能をHTML Headerタグとして普通のHTMLページ内で 使ってページのコード種を指定することもできます。

<META HTTP-EQUIV="Content-type: text/html; charset=x-euc-jp">
しかしbrowserによっては誤作動を起こしてパニック状態になる場合もあります。 本来、ページの文字コードくらいは browser が正しく認識すべきこと なのですが、いまだに誤判定を起こすことがあります。


■ <!-- 漢字コードはEUC -->

HTTPd-HeaderでもHTML Header tagでもなんでも無いのですが、 ブラウザの漢字コード判定を多いに助けるおまじないです。

<!-- 漢字コードはEUC -->
<HTML>

これにより、browserはページの冒頭で漢字コードを判別できます。 なぜならこの「漢字コードはEUC」の言葉の各漢字すべてが EUC独特のコードであるからです。 それでもコードの判定に失敗するようなら、それはbrowserの不良です。


■ Set-Cookie

クライアントに cookieを設定させるためのHTTP-Headerです。

printf("Content-type: text/html\n");
printf("Set-Cookie: name=value; expires=Man, 19-Jan-98 00:00:00 GMT; path=/~naoki/cgi-bin/\n\n" );

目次

Copyright(C) by Naoki Watanabe. Oct 21st, 1995.
渡辺尚貴 naoki@cms.phys.s.u-tokyo.ac.jp