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 タイプさえ一致してしまえば、動的コンテンツであっても問答無用でキャッシュしてしまう。

ExpiresActive に MIME タイプ指定が出来るせいで、これで全て制御できそうだと勘違いしてしまうが、結局のところは Header 命令と同じように Files ディレクティブと組み合わせるのが無難か。

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

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