キャッシュをめぐるApache2.2との格闘は,まだ続く...

  • URLがパラメータを含む場合は,CGIのレスポンスでExpiresヘッダを返さなければキャッシュされない

という事実があるのだが,Expiresヘッダに何を指定すれば良いのか?というのが問題だ. (なお,ここでのURLはGET時のURLではない.試しにrewriteでパラメータを含まないGETでアクセスできるようにしてみたが,無駄だった...)

今日調べてみたところでは,Expiresで指定している期間がくるまではApacheの設定が

CacheIgnoreCacheControl off
なのに,ブラウザからのno-cacheリクエスト(CTRL+F5など)が効かず,古いコンテンツが送られ続けられるのである.

整理すると,

  • (A) Expiresヘッダをつけない場合 (静的コンテンツ)
  • →no-cacheのリクエストをブラウザから投げることで,該当ファイルのキャッシュを最新に更新可能

  • (B) Expiresヘッダをつける場合 (WikiなどのCGI)
  • →no-cacheのリクエストをブラウザから投げても,該当ファイルのキャッシュは更新不可能.期限切れになるまで古いファイルが送られ続ける

ということになる.キャッシュを好きなときに更新できないのは非常に困る.

仕方がないので,そういうときにはキャッシュファイルを手動で消してしまうという荒技を使うことにした. 以下のような感じで,CacheRootをサーバ全体ではなく各VirtualHost内に対して指定して,特定のVirtualHostのキャッシュを全消しする,という運用ができるように設定した.

httpd.confより

〜
CacheDirLevels 2
CacheDirLength 1

<VirtualHost kamoland.com>
    〜
  CacheRoot "/var/cache/apache2/disk_cache/vh1"
  CacheMaxExpire 604800
  CacheEnable disk /
  CacheDisable /rss/
</VirtualHost>

<VirtualHost www.rensa.info>
    〜
  CacheRoot "/var/cache/apache2/disk_cache/vh2"
  CacheMaxExpire 259200
  CacheEnable disk /
  CacheDisable /rss/
</VirtualHost>

キャッシュのクリアが必要なときは,Apacheを止めて

rm -rf /var/cache/apache2/disk_cache/vh2/*
という荒技である.

で,話を戻すと,このようにキャッシュクリアの手段が一応あるという前提なら,CGIのレスポンスで返すExpiresヘッダは,ある程度長めにとっても良かろうと思える.

...今のところ,リクエスト日から3日後にして様子を見ている.

次回に続く


© 2023 KMIソフトウェア