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のダウンロードとかにも応用できると思いま。