キャッシュ機能を実装するときに、いろいろ調べたので、
その時の備忘録。
Cache-Controlのディレクティブ
標準的なディレクティブは以下の通り。MDNから引用。
・Cache-Control - HTTP | MDN
リクエスト | レスポンス |
---|---|
max-age | max-age |
max-stale | - |
min-fresh | - |
- | s-maxage |
no-cache | no-cache |
no-store | no-store |
no-transform | no-transform |
only-if-cached | - |
- | must-revalidate |
- | proxy-revalidate |
- | must-understand |
- | private |
- | public |
- | immutable |
- | stale-while-revalidate |
stale-if-error | stale-if-error |
利用例
キャッシュOKかどうか
# キャッシュNG Cache-Control: no-store # キャッシュOKだけど、検証が必要 Cache-Control: no-cache # ブラウザなどローカルにはキャッシュしない Cache-Control: private # キャッシュOK Cache-Control: public
キャッシュする時間
# N秒までキャッシュする(例: 604800秒) Cache-Control: max-age=604800 # CDNのキャッシュ時間(例: 604800秒) Cache-Control: s-maxage=604800
検証の有無
# 検証必須(例: 604800秒以降は再検証) Cache-Control: max-age=604800, must-revalidate # 裏で検証可(例: 604800秒以降で86400秒までは、古いキャッシュを返しつつ、裏で再検証) Cache-Control: max-age=604800, stale-while-revalidate=86400
Cloudflareでの振る舞い
この記事がすごくわかりやすい。
デフォルトの動作は以下にある通り。拡張子などにより決まっている。
それ以外はページルールを利用して設定が必要。
Cache-Control
に変わり、CDN-Cache-Control
というのもあるらしい。
- CloudflareがCDN向けキャッシュヘッダーCDN-Cache-Controlを実装したので触ってみた | DevelopersIO
- CDNキャッシュ向けレスポンスヘッダーCache-Control:s-maxage を触ってみた | DevelopersIO
Etagを利用した再検証の仕組み
レスポンスにEtag
を含めて返すと、
再検証時のリクエストにIf-None-Match
に渡ってくる。
Etagについてはこのあたり。
- Using ETag Headers with Cloudflare – Cloudflare Help Center
- ETag - HTTP | MDN
- If-None-Match - HTTP | MDN
stale-while-revalidate
などを再検証が必要なディレクティブを指定していると、
If-None-Match
にキャッシュされたレスポンスのEtag
の値が返ってくるので、
それをみて、キャッシュを使ってよいか判断する。
以上!!
参考にしたサイト様
- Using ETag Headers with Cloudflare – Cloudflare Help Center
- ETagを使ってSpringとHibernateの転送量と負荷を削減する
- HTTPヘッダーCache-Control stale-while-revalidateを理解する|Next.js|開発ブログ|株式会社Nextat(ネクスタット)
- Cloudflare を使ったキャッシュの基礎 - 30歳からのプログラミング
- If-Match - HTTP | MDN
- ETag - HTTP | MDN
- ETagとは - Qiita
- Cache-Control - HTTP | MDN
- CDNキャッシュ向けレスポンスヘッダーCache-Control:s-maxage を触ってみた | DevelopersIO
- CloudflareがCDN向けキャッシュヘッダーCDN-Cache-Controlを実装したので触ってみた | DevelopersIO
- stale-while-revalidate対応のCDNでISRのような挙動を実現する