Catalystで直接Expiresヘッダーを出力する

静的なファイルは基本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のダウンロードとかにも応用できると思いま。