apacheのキャッシュが効きません
MacOSX SierraにHomebrewでapache2を入れ、png画像とhtmlを配置しています。
画像をキャッシュしたいと思い、以下のようにhttpd.confの設定をしました。
強制的にdiskキャッシュするためのモジュールのインポートと、diskキャッシュの設定と、ヘッダの設定です。
Last-modefiedとExpireがレスポンスヘッダに乗っていないとキャッシュされないと(どこかで)見たためこちらも追記しており、両方正常にレスポンスヘッダに乗っていることを確認しています。
LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
<IfModule mod_cache.so>
<IfModule mod_disk_cache.so>
CacheRoot /tmp/cache
CacheEnable disk /
CacheIgnoreCacheControl On
CacheIgnoreNoLastMod On
CacheDefaultExpire 86400
CacheMaxExpire 172800
</IfModule>
</IfModule>
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault
ExpiresByType image/png
<IfModule mod_headers.c>
Header append Cache-Control "public, max-age=86400"
Header set Expires "Mon, 26 Jul 2017 05:00:00 GMT"
</IfModule>
</IfModule>
その後、/tmp/cacheを作成しパーミッションを777にしてapacheをrestartし、chromeのdeveloperツールのネットワークを開き、htmlのaタグから画像にアクセスし、1回目でStatus 200、2回目で(from disk cache)と表示されていることを確認しているのですが/tmp/cacheには何もファイルが残っていません。また、chromeを再起動してから再び画像にアクセスするとStatus200となります。
Webサーバの設定でブラウザを再起動してもローカルのキャッシュを表示する方法はありますか?
1回目のアクセス時のレスポンスヘッダです。
↓
ご指摘頂き、apacheの設定の仕方が間違っていたことがわかりました。
Header append Cache-Control "public, max-age=86400"
を
Header set Cache-Control "public, max-age=86400"
とすることでChromeを再起動させてもapacheにアクセスログが表示されないことを確認しました。
ただ、safariではアクセスがされてしまい、固有のバグのようでした。
ローカルキャッシュの活用を考えていますが、やりたいこととしては必要のない画像取得の通信を出来るだけ減らしたい、更新のない同じ画像を何度もapacheからダウンロードさせるのは避けたいが更新があれば通信させるということです。
オフラインでも動くことは求めておらず、画像はバナーや商品画像など様々なものがあるためマニフェストファイルに画像を指定するApplicationCacheよりローカルストレージを使い、キャッシュを更新したいときはAPIから更新フラグを受け取り、更新する場合はclearCacheするという方法を用いたいと思います。
↓
と思ったのですがAPIからキャッシュクリアするフラグを入れるのは悪手だということがわかりました。
どれだけの期間フラグをtrueにするかの問題とか、フラグがtrueになっている間はアプリを起動するたびにキャッシュ削除→画像再取得という状態になってしまうので、画像URLを変更しようと思います。