Apacheのmod_expiresは、既にレスポンスにExpiresヘッダが存在すると、それを変更しないので。そこで強制的に上書きできる様、patchをあててみた。
--- httpd-2.2.17.orig/modules/metadata/mod_expires.c 2008-11-12 04:59:22.000000000 +0900
+++ httpd-2.2.17/modules/metadata/mod_expires.c 2011-01-20 11:47:03.000000000 +0900
@@ -472,6 +472,11 @@
expiry = apr_table_get(r->headers_out, "Expires");
t = r->headers_out;
}
+ if ( apr_table_get(r->subprocess_env, "override_expires") ) {
+ expiry = NULL;
+ apr_table_unset(t,"Expires");
+ apr_table_unset(t,"Cache-Control");
+ }
if (expiry == NULL) {
/*
* No expiration has been set, so we can apply any managed by
override_expiresという環境変数をセットすると強制上書きモードになります
SetEnv override_expires 1
ExpiresActive On
ExpiresByType text/html "access plus 1 days"
これでReverseProxyで利用している時など、後ろからへっぽこなExpiresとCache-Controlが来たとき(例えば後ろがSquidだったとき)に上書きしてレスポンスすることができます。強制上書きモードでは、Cache-Controlのprivateやpublicなどのmax-age以外のオプションは消えてしまうので必要な場合はmod_headersモジュールなどで適宜追加するといいかと思います
nginxのHttpHeadersModuleでは、特にチェック無く上書きしてしまうようだ。RFC的にはExpiresを保持するのが正しいのかな