Catalystで直接Expiresヘッダーを出力する
2013年2月27日
静的なファイルは基本Expiresを設定しているんですが、動的なところにもExpires設定したいですよね?
nginxでまるっと全部Expiresを設定する事もできるんですが、動的なページまでキャッシュされても困るので、CatalystでExpiresヘッダーを返したいと思います。
Controllerにゴリゴリと書くのはあまり好きじゃないですが、サンプルなので。
use DateTime;
use DateTime::Format::HTTP;
sub image : Regex('^img/(\d+)\.jpg$') {
my ( $self, $c ) = @_;
my $img_id = $c->req->captures->[0];
# 画像ファイルをopenしてバイナリを取得(省略)
my $img_data = 'ここにバイナリ入ってます';
# 1年後の日付をHTTPフォーマットで取得
my $dt = DateTime->now( time_zone => 'Asia/Tokyo' );
$dt->add( years => 1 ); # 1年後
my $expires = DateTime::Format::HTTP->format_datetime( $dt );
$c->res->headers->header( 'Expires' => $expires );
$c->res->content_type("image/jpeg");
$c->res->body( $img_data );
}
これで、直接画像を出力しつつ、Expiresヘッダーも設定できました。
動的にcssとかjs作ったり、csvのダウンロードとかにも応用できると思いま。