mod_cacheの有効期限について勘違いしてた。
mod_cache - Apache HTTP サーバ
mod_cacheは基本的に、Last-Modifiedヘッダがないコンテンツ(レスポンス)はキャッシュしない。"CacheIgnoreNoLastMod On"とする事で、Last-Modifiedヘッダがなくてもキャッシュするようになる。
Last-Modifiedヘッダがあり、有効時間が設定されていないコンテンツ(レスポンス)の有効期限は、特別な式で計算される。
有効時間[s] = (現在日時[s] - コンテンツ最終更新日時[s]) * CacheLastModifiedFactor
Expiresヘッダに使われる有効期限は、"現在日時+有効時間"で決まる。このとき、有効時間は"CacheMaxExpire"を最大とする。
キャッシュ有効時間のデフォルトとして、"CacheDefaultExpire"ディレクティブが利用可能。ただし、これはLast-Modifiedヘッダがなく、有効時間も設定されていないコンテンツに限って有効となる。
ずっと、"CacheDefaultExpire"が無条件で使えるんだと考えてたので、大失敗。PHPでの動的コンテンツのキャッシュを考えていて、If-Modified-Sinceでの304応答が出来るようにと、Last-Modifiedヘッダを付けたのがまずかった(まずくないんだけど)。Last-Modifiedヘッダをつけたのに、"CacheLastModifiedFactor"を調整しなかったので微妙にキャッシュがきかなかったり。
問答無用で一定時間はサーバ側でキャッシュしたコンテンツを返したかったので、"CacheLastModifiedFactor"を"CacheMaxExpire"にそろえて、"Last-Modified == 現在日時"でない限りは"CacheMaxExpire"が使われるように調整。効果云々は抜きにして、期待通りの結果が得られて満足(とりあえずは)。
あと、mod_disk_cacheを使っているので、htcachecleanをデーモンで起動。
htcacheclean - Clean up the disk cache - Apache HTTP Server
さて、これから様子を見て調整してかないとね。

