レスポンスヘッダにExpiresやCache-Controlを追加することで、ブラウザのキャッシュを有効活用し、ダウンロードの時間をなくす事でウェブの高速化を実現できます。またサーバ側にとってもリクエスト数を減らす事ができ、負荷の削減にもなります

ApacheにはExpiresやCache-Controlを付加するmod_expiresというモジュールがありますが、Plackにはまだなかったので作ってみました。VarnishのようにWebサーバ機能を持たないリバースプロキシを使う場合には、便利なんじゃないかなぁと思います

CPANにリリース済みです http://search.cpan.org/dist/Plack-Middleware-Expires/

使い方

builder {
    enable 'Expires',
        content_type => [ 'text/css', 'application/javascript', qr!^image/! ],
        expires => 'access plus 3 months';
    enable 'Plack::Middleware::Static',
        path => qr{^/(favicon\.ico$|static/)}, root => './htdocs';
    $app;
}

content_typeでヘッダを付加するMIME typeを指定します。 pathを限定するためにPlack::Builder::Conditionals(github)と一緒に組み合わせたら便利かも

content_type => 'text/css'
content_type => qr!^image!
content_type => [ 'text/css', 'application/javascript', qr!^image/! ]

スカラ値、Regexp、もしくはそれらが入る配列のリファレンスを指定できます

expiresには、Apacheのmod_expiresと同じフォーマットでキャッシュの有効時間を入れます

expires => 'M3600' #最終更新時間 + 1時間(3600秒)
expires => 'A86400' # アクセス時間 + 1日
expires => 'modification plus 3 years 3 month 3 day' #最終更新時間 + 3年3ヶ月3日
expires => 'access plus 3 days' #アクセス時間 + 3日

などと書けます。最終更新時間はLast-Modifiedヘッダからとるため、Last-Modifiedヘッダが存在しないときには機能が働きません。

また、Expiresが有効となるのは、レスポンスのステータスが200系や300系の時だけで、エラー時には動きません。また既にあるExpiresヘッダを上書きしません。