Expires

ここから、HTTPキャッシュの話。

HTTP キャッシュ - HTTP | MDN
Expires - HTTP | MDN

ブラウザの挙動として、キャッシュをさせるかさせないかというところに関して試してみると、キャッシュをさせないという命令については簡単なんだけど、逆にキャッシュをさせたい場合は難しかった・・・。
まあ、基本的にはキャッシュをさせたくないという要望が一般的になっている模様なので。
Expiresヘッダで、未来の時刻とか設定すると、キャッシュからファイルを取ってくるパターンが発生する。
http_server.cで、

時刻を表示するようにした。
そしてヘッダに"Expires: Sat, 31 Dec 2022 12:00:00 GMT\r\n"を追加。
キャッシュ期限が未来なら、キャッシュも起きやすくなる。

起動して1発目で、Chromeのデベロッパーツールを開いてアクセスすると、時刻が出てちゃんとアクセスしている模様。
起動して1発目で、Chromeデベロッパーツールを開いてアクセスすると、時刻が出てちゃんとアクセスしている模様。

起動して1発目で、Chromeデベロッパーツールを開いてアクセスすると、時刻が出てちゃんとアクセスしている模様。

サーバ側にもリクエストは来てる。まあ下はfavicon.icoだけど。
サーバ側にもリクエストは来てる。まあ下はfavicon.icoだけど。

サーバ側にもリクエストは来てる。まあ下はfavicon.icoだけど。

基本的に現代のブラウザは基本ノーキャッシュでアクセスしようとするのでそのままではキャッシュを見てくれない
基本的に現代のブラウザは基本ノーキャッシュでアクセスしようとするのでそのままではキャッシュを見てくれない

基本的に現代のブラウザは基本ノーキャッシュでアクセスしようとするのでそのままではキャッシュを見てくれない。

またリクエスト来てる。faviconはno-cacheと付けてるし。
またリクエスト来てる。faviconはno-cacheと付けてるし。

またリクエスト来てる。faviconはno-cacheと付けてるし。
ただこうやってアクセスしてるのは意味があって、Expiresで未来の期限を付けてることで、このサイトはキャッシュを見てもいいんだなと、ブラウザに思い込ませてるのよね。
さて、ここからが本番。一番起きやすいのは起動して一発目のアクセス。

まず起動する準備をしておく
まず起動する準備をしておく

まず起動する準備をしておく。

そしてURLもセットしておく。サジェストが出てない状態の方がいいかな。URLのテキストだけ出てる状態。
そしてURLもセットしておく。サジェストが出てない状態の方がいいかな。URLのテキストだけ出てる状態。

そしてURLもセットしておく(アクセスはしない)。サジェストが出てない状態の方がいいかな。URLのテキストだけ出てる状態。

Chromeのデベロッパーツールを起動
Chromeデベロッパーツールを起動

Chromeデベロッパーツールを起動。

デフォルトのmsnを表示してる状態でサーバ起動
デフォルトのmsnを表示してる状態でサーバ起動

デフォルトのmsnのトップページを表示してる状態でサーバ起動。
で、URLバーの入力のところでリターンキーでアクセスする。

惜しい。本体がprefetch cacheになってる。faviconはdisk cacheだが。
惜しい。本体がprefetch cacheになってる。faviconはdisk cacheだが。

惜しい。本体がprefetch cacheになってる。faviconはdisk cacheだが。

acceptは来てるのにリクエストは来てない
acceptは来てるのにリクエストは来てない

acceptは来てるのにリクエストは来てない。
で、サーバをいったん止めて、ブラウザも1回閉じて、同じようにブラウザを起動し、デベロッパーツールを開き、URLバーからリターンでアクセス。

今度は両方disc cacheになってる
今度は両方disc cacheになってる

今度は両方disc cacheになってる。

またacceptは来るのにリクエストはきてない
またacceptは来るのにリクエストはきてない

またacceptは来るのにリクエストはきてない・・・。
そしておわかりいただけだろうか・・・。
時刻が07:29:04 GMTから変わっていないことを・・・。
ちなみに・・・。

赤い枠のリロードボタンで更新した場合は、キャッシュではなく本体を見に行きます。
赤い枠のリロードボタンで更新した場合は、キャッシュではなく本体を見に行きます。

赤い枠のリロードボタンで更新した場合は、キャッシュではなく本体を見に行きます。

リクエストも来てる
リクエストも来てる

リクエストも来てる。
またChromeでは、初回のリターンキーアクセスではキャッシュを見に行くものの、2回目のリターンキーアクセス以降は本体を見に行く模様。
Edgeもそんな感じっぽい(ちゃんと試してないけど。)
ちなみに、

更新ボタンリロードだと、ブラウザもCache-Control: max-age=0とノーキャッシュ要求してくる。
更新ボタンリロードだと、ブラウザもCache-Control: max-age=0とノーキャッシュ要求してくる。

更新ボタンリロードだと、ブラウザもCache-Control: max-age=0とノーキャッシュ要求してくる。
さて、

IEの場合は開発者ツール
IEの場合は開発者ツール

IEの場合は開発者ツール。

こちらも、あらかじめ何度かアクセスさせてExpiresを解釈してもらってから、再起動初回1発目アクセスするとキャッシュを見に行く。
こちらも、あらかじめ何度かアクセスさせてExpiresを解釈してもらってから、再起動初回1発目アクセスするとキャッシュを見に行く。

こちらも、あらかじめ何度かアクセスさせてExpiresを解釈してもらってから、再起動初回1発目アクセスするとキャッシュを見に行く。
IEの場合は、リターンキーアクセスであれば、何度アクセスしてもキャッシュを見に行くところがChromeと違う。

ただし、リロードボタンはやはり本体を見に行く。
ただし、リロードボタンはやはり本体を見に行く。

ただし、リロードボタンはやはり本体を見に行く。

Sample/http/Expires/Expires/src/Expires at master · bg1bgst333/Sample · GitHub