ここから、HTTPキャッシュの話。
HTTP キャッシュ - HTTP | MDN
Expires - HTTP | MDN
ブラウザの挙動として、キャッシュをさせるかさせないかというところに関して試してみると、キャッシュをさせないという命令については簡単なんだけど、逆にキャッシュをさせたい場合は難しかった・・・。
まあ、基本的にはキャッシュをさせたくないという要望が一般的になっている模様なので。
Expiresヘッダで、未来の時刻とか設定すると、キャッシュからファイルを取ってくるパターンが発生する。
http_server.cで、
時刻を表示するようにした。
そしてヘッダに"Expires: Sat, 31 Dec 2022 12:00:00 GMT\r\n"を追加。
キャッシュ期限が未来なら、キャッシュも起きやすくなる。
起動して1発目で、Chromeのデベロッパーツールを開いてアクセスすると、時刻が出てちゃんとアクセスしている模様。
サーバ側にもリクエストは来てる。まあ下はfavicon.icoだけど。
基本的に現代のブラウザは基本ノーキャッシュでアクセスしようとするのでそのままではキャッシュを見てくれない。
またリクエスト来てる。faviconはno-cacheと付けてるし。
ただこうやってアクセスしてるのは意味があって、Expiresで未来の期限を付けてることで、このサイトはキャッシュを見てもいいんだなと、ブラウザに思い込ませてるのよね。
さて、ここからが本番。一番起きやすいのは起動して一発目のアクセス。
まず起動する準備をしておく。
そしてURLもセットしておく(アクセスはしない)。サジェストが出てない状態の方がいいかな。URLのテキストだけ出てる状態。
デフォルトのmsnのトップページを表示してる状態でサーバ起動。
で、URLバーの入力のところでリターンキーでアクセスする。
惜しい。本体がprefetch cacheになってる。faviconはdisk cacheだが。
acceptは来てるのにリクエストは来てない。
で、サーバをいったん止めて、ブラウザも1回閉じて、同じようにブラウザを起動し、デベロッパーツールを開き、URLバーからリターンでアクセス。
今度は両方disc cacheになってる。
またacceptは来るのにリクエストはきてない・・・。
そしておわかりいただけだろうか・・・。
時刻が07:29:04 GMTから変わっていないことを・・・。
ちなみに・・・。
赤い枠のリロードボタンで更新した場合は、キャッシュではなく本体を見に行きます。
リクエストも来てる。
またChromeでは、初回のリターンキーアクセスではキャッシュを見に行くものの、2回目のリターンキーアクセス以降は本体を見に行く模様。
Edgeもそんな感じっぽい(ちゃんと試してないけど。)
ちなみに、
更新ボタンリロードだと、ブラウザもCache-Control: max-age=0とノーキャッシュ要求してくる。
さて、
IEの場合は開発者ツール。
こちらも、あらかじめ何度かアクセスさせてExpiresを解釈してもらってから、再起動初回1発目アクセスするとキャッシュを見に行く。
IEの場合は、リターンキーアクセスであれば、何度アクセスしてもキャッシュを見に行くところがChromeと違う。
ただし、リロードボタンはやはり本体を見に行く。
Sample/http/Expires/Expires/src/Expires at master · bg1bgst333/Sample · GitHub