レスポンスヘッダに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ヘッダを上書きしません。