同じ URL で複数バージョン!Cache Rules が Vary ヘッダーを理解しはじめたよ
やっほー、しぃちゃんだよ!今日はキャッシュがちょっと賢くなる、うれしいニュースを持ってきたよ。
Cloudflare Changelogなにが発表されたの?
Cloudflare の Changelog で、Cache Rules が Vary レスポンスヘッダーをそのまま解釈できるようになったって発表があったの。
同じ URL でも、言語 (Accept-Language) や形式 (Accept) ごとにオリジンが違うレスポンスを返すことってあるよね。これからは Cloudflare のキャッシュがその違いをちゃんと見分けて、リクエストごとに正しいバージョンを返してくれるようになったんだよ。
今までどうだったの?
これまでは、同じ URL なのに中身が変わるコンテンツは、キャッシュに載せると間違ったバージョンを返しちゃう危険があったの。だから正しさを守るには、キャッシュをバイパス(迂回)させるしかなかったんだよね。せっかくのキャッシュが使えなくて、もったいなかったの。
これで何が変わるの?
オリジンが Vary ヘッダーに「このリクエストヘッダーで中身が変わるよ」と並べておくと、そのヘッダーがキャッシュキーの一部になって、同じ URL のまま複数のバージョンをキャッシュに置けるようになるの。
うれしいのは、オリジンや Worker 側のコードを一切変えなくていいこと。今までバイパスしてたコンテンツもキャッシュに載せられるから、キャッシュヒット率も上がるんだよ。
深く潜ってみよう
オリジンが Vary で指定した各ヘッダーに対して、3 つの動作から選べるの。
- normalize:意味が同じヘッダー値を同じキャッシュキーにまとめる。
Accept/Accept-Language/Accept-Encodingみたいな用途にぴったりで、冗長なバージョンを減らせるよ。 - passthrough:ヘッダーの生の値でバージョンを選んで、オリジンにもそのまま渡す。1 バイトの違いでバージョンを分けたいときに。
- bypass:そのヘッダー名が Vary に出てきたらキャッシュをバイパス。ユーザーごとに違う値や、取りうる値が多すぎて安全にキャッシュできないヘッダー向け。
この挙動は RFC 9111 / RFC 9110 の標準的な HTTP キャッシュの考え方に沿ってるの。対応プランは Free・Pro・Business・Enterprise の全プランだよ。
設定は Cloudflare ダッシュボードか Rulesets API からできて、詳しい設定方法は Cache Rules の Vary 設定 にまとまってるよ。
Workers からもっと細かく制御したいときは、cf.vary プロパティも合わせてどうぞ。
まとめ
- 同じ URL で言語や形式ごとに違うレスポンスを、
Varyヘッダーを見てキャッシュし分けられるようになったよ - normalize / passthrough / bypass の 3 つから、ヘッダーごとに挙動を選べる
- オリジンや Worker のコード変更は不要。バイパスしてたコンテンツもキャッシュできてヒット率アップ
- Free から Enterprise までの全プランで、ダッシュボードか Rulesets API から設定できる
多言語サイトやコンテンツネゴシエーションを使ってる人、キャッシュヒット率をもう一段上げたい人にうれしいアップデートだよ!