Seaside Laboratory

Posts

ExpiresActive の落とし穴

さくらサーバでは Header 命令が使えず、他の代替手段もなかったので、長い間キャッシュを制御できない状態が続いていたが、mod_expires モジュールの追加によって ExpiresActive が使えるようになった。

ということで、まずは画像がキャッシュされるようにした。

ExpiresActive On
ExpiresByType image/gif "access plus 1 weeks"
ExpiresByType image/jpeg "access plus 1 weeks"
ExpiresByType image/png "access plus 1 weeks"

静的な HTML が多いサイトであれば、HTML ファイルもキャッシュの対象とすることもある。

ExpiresByType text/html "access plus 8 hours"

ここで注意すべき点は、ExpiresActive が MIME タイプでキャッシュ対象を識別しているということ。Header 命令のときは Files ディレクティブを使って拡張子による振り分けを行っていたので、CGI のような動的コンテンツと、それ以外の静的コンテンツがうまく分離されていたが、ExpiresActive は動的コンテンツであっても MIME タイプさえ一致すれば有効になってしまう。

結局のところは Header 命令と同じように Files ディレクティブと組み合わせて使うのが無難。

<Files ~ "\.(gif|jpg|jpeg|png)$">
ExpiresActive On
ExpiresDefault "access plus 1 weeks"
</Files>

CGI は独自のキャッシュヘッダーを出力することが多々あるので、キャッシュ設定を変更したときは、実際に出力される HTTP ヘッダーを確認しておくのがオススメ。Apache と CGI の両方でヘッダー出力を行った結果、同一ヘッダーが複数個出力されるような事態は回避しておきたい。