HTTPヘッダの生成
■この章で解説するモジュール
CGI (redirect)
■この章でできること
・コンテンツをキャッシュする期間を設定する
・ブラウザにファイルをダウンロードさせる
・URLをリダイレクトさせる

 CGIモジュールの基礎2ではCGI::headerメソッドの解説をしました。ここではCGIモジュールを使っていろいろなHTTPヘッダを生成する方法について解説します。

 まずは、expiresパラメータの使用例を示します。このパラメータを使うと、ブラウザやプロキシサーバがCGIの出力したコンテンツをキャッシュする期間を指定することができます。

#!/usr/bin/perl

#############################################
# HTTPヘッダのサンプル1
# Author: "Perl Programming Tips"
#############################################

use CGI qw/:standard/;

$now = localtime(time);

print header(-expires=>'+30s');
print start_html(-title=>'Hello');
print h1("$now");
print end_html();

 (実行結果はここをクリック)

 headersのパラメータに「-expires=>」を指定します。指定できる値の例は次の通りです。数値部分は任意に指定できます。

意味
+30s
30秒後
+10m
10分後
+1h
1時間後
-1d
1日前(=今すぐ)
now
今すぐ
+3M
3か月後
+10y
10年後
Thu
31 Jul 2008 07:08:31 GMT,指定した日時

 例えば1日1回決まった時刻に更新するコンテンツであれば、更新日時+1日に設定しておけば、コンテンツを次に更新するまでは、ブラウザ側に現在のコンテンツをキャッシュさせることができます。

 上のサンプルでは、現在時刻をCGIで出力しています。何度か開いてみると、30秒ごとにページが更新されるのが分かると思います。ただし、IEの場合、ブラウザの「更新」ボタンを押した場合は、この設定にかかわらず最新の状態に更新されます。また、Webサーバ側にPragma:no-cacheの設定がされているとキャッシュ機能は無効になります。

 次は、attachmentパラメータについて説明します。このパラメータは、ページを表示するのではなく、ファイルをダウンロードさせたい場合に使用します。attachmentの値にはブラウザ側で保存するファイル名を指定します。

 これを使う場合は、typeを「application/octet-stream」に指定します。こうするとブラウザ側では以降に続くデータをバイナリデータとしてファイルに保存しようとします。ではサンプルです。

#!/usr/bin/perl

#############################################
# HTTPヘッダのサンプル2
# Author: "Perl Programming Tips"
#############################################

use CGI qw/:standard/;

print header(-type=>'application/octet-stream',
    -attachment=>'dl_sample.txt');

print "テスト1\n";
print "テスト2\n";

 (実行結果はここをクリック)

 次は、リダイレクトヘッダを生成する方法について解説します。リダイレクトヘッダとは、コンテンツを表示する代わりに別のURLにリダイレクトすることを示すヘッダです。これを利用すると、CGIで何らかの処理をした後に、結果表示用に別のCGIを呼ぶようなこともできます。

 リダイレクトヘッダを生成するには、CGI::redirectメソッドを使います。

CGI::redirect
HTTPヘッダ(リダイレクト)を生成する
書式
redirect uri
redirect -uri=>uri, -nph=>nph, -status=>status
引数
uri:
リダイレクト先のURI
nph:
1を指定した場合は、NPH(no-parse-header)として動作する。
status:
ステータスコード(デフォルト:302)
戻り値
HTTPヘッダ(リダイレクト)

 リダイレクト時のステータスコードはHTTPでは次のものが定義されています。

・301 Moved Permanently

・302 Found

・303 See Other

 では、リダイレクトのサンプルです。

#!/usr/bin/perl

#############################################
# HTTPヘッダのサンプル3
# Author: "Perl Programming Tips"
#############################################

use CGI qw/:standard/;

print redirect(-uri=>'http://www.g-ishihara.com/perl/index.html');

 (実行結果はここをクリック)

 このサンプルでは、CGI内では特に何もしないで、このサイトのトップページにリダイレクトさせています。