■画像のキャッシュ
ページは新しいが、画像は古いキャッシュを参照している理由
影響因子:ブラウザキャッシュ>プロキシ>ファイアウォール>ロードバランサ>htaccessのようなサーバ設定
基本的な考え方:キャッシュはPHPページ等でのディレクティブで制御されるが、特に画像等はプロキシではキャッシュ期間が優先される場合がある(ブラウザ更新ボタンでスキップできるが、、)
1)ページ遷移時は、キャッシュがありExpire等が効いている場合は、完全にローカルキャッシュだけを使ってそもそもリクエストを送っていません。
(ちなみに、ページを進んで(ブラウザの戻る機能で)戻ったときは大元のHTMLを含めてキャッシュが使われたりします。)
2)リロードは大元のHTMLを受け取ったら、そのページ内のリソースについてレスポンスヘッダを確認しに行っています。その結果304 Not Modifiedが帰ってきて、実際にはキャッシュを使います。
3)スーパーリロードCtrl+F5(Ctrl+更新ボタン)はキャッシュに関係なく、すべてのリソースを取得しなおしています。
リロードをしても表示されない時ブラウザのキャッシュ削除するといいのは、この辺りが上手く行っていないからだと言える
どういうリクエスト/レスポンスの流れ?(304はトラフィックは減るが比較でサーバリソースを食う場合もある)
1)ブラウザのキャッシュ :Expire/max-ageのあるとき?、あるいはブラウザキャッシュ削除
2)ブラウザ→プロキシのキャッシュ :Cache refreshでの間隔で処理、あるいはブラウザ更新ボタン
3)ブラウザ→プロキシ→サーバで304 not modefied(ブラウザ/プロキシのキャッシュが使用される)
http://www.atmarkit.co.jp/ait/articles/0305/10/news002.html
http://blog.redbox.ne.jp/http-header-tuning.html
HTTPヘッダ(htttpヘッダはプログラムで制御できる)
Pragma
•Cache-Control(汎用)-no-cache, max_ageディレクティブなど
•Age(レスポンス)
•Date(汎用)
•Expires(エンティティ)
•Last-Modified(エンティティ)
•If-Modified-Since(リクエスト)
•If-Unmodified-Since(リクエスト)
•ETag(レスポンス)
•If-Match(リクエスト)
•If-None-Match(リクエスト)
•Range(リクエスト)
•If-Range(リクエスト)
ブラウザに一切キャッシュさせたくない場合Cache-Control "no-cache" この辺りの動作は環境に依存する
ブラウザにキャッシュさせるが変更ないか都度確認Cache-Control "max-age=0" or Expires "Mon, 26 Jul 1997 05:00:00 GMT"
ブラウザにキャッシュさせ都度確認はそれほど必要ないCache-Control "max-age=秒数" or Expires "Mon, 26 Jul 2020 05:00:00 GMT"
Cache-Control: private webサーバから返されるコンテンツがただ一人のユーザのためのもので複数のユーザが共有されるキャッシュに記録されるべきではない
Cache-Control: must-revalidate キャッシュに記録されているコンテンツが現在も有効であるか否かをWebサーバに必ず問い合わせよ
metaタグ
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="0">キャッシュの有効期限,0=キャッシュさせない
no-store:キャッシュするな→ Webサーバから返却されるコンテンツをキャッシュするな
no-cache:キャッシュしても良いが、確認してから使え→ キャッシュは使用しても良いが現在でも有効か否か確認した上で使用しろ
no-cacheがキャッシュを使用しない設定に思えるが実際には、no-storeがキャッシュをさせない設定。大体の場合ではno-cacheでOK
シリアルの変数を付ける
<img src="http://aaa/v.gif?27" />
<link type="text/css" rel="stylesheet" href="styles.css?20130420-1100">
.htaccess
<Files ~ ".(gif|jpe?g|png|ico|js|gz|otf|ttf|eot|woff)$">
Header set Cache-Control "max-age=2592000"
</Files>
プロキシサーバ
基本はどれだけの期間キャッシュを保つかのCache refresh設定、他はhttpヘッダのディレクティブで制御されると考える
Cache Refresh 設定 HTTPドキュメントの場合(4-8時間、5min、20%等複合)の更新間隔を保つ、ブラウザ更新ボタンで取得も可能だし
20%の意味は、1週間前の10080前にできた場合これを1440/10080=14.2%となってまだ新しいとみなす
Last-Modified 要素を 0.1 に設定した場合、最後の変更が 10 日前に行われたドキュメントのケースだとプロキシはこの要素の意味を、ドキュメントが 1 日 (10 * 0.1 = 1) の間変更されない、と解釈します。その場合、ドキュメントのチェックが 1 日以内に実行されている場合、プロキシはキャッシュからドキュメントを返します
使用されたキャッシュの回数
キャッシュの容量
Internet Cache Protocol (ICP) はキャッシュ(プロキシ)間の対話を可能で履歴を共有
(Sun Java System Web Proxy Server) https://docs.oracle.com/cd/E19636-01/819-3160/agcache.html
http://trafficserver.readthedocs.io/ja/latest/admin-guide/configuration/cache-basics.en.html
(Squid) http://d.hatena.ne.jp/takami_hiroki/20101006/p1
(Vanish) http://www.kumoyanet.com/420/