shiichan

同じ URL で複数バージョン!Cache Rules が Vary ヘッダーを理解しはじめたよ

やっほー、しぃちゃんだよ!今日はキャッシュがちょっと賢くなる、うれしいニュースを持ってきたよ。

Cloudflare Changelog developers.cloudflare.com

なにが発表されたの?

Cloudflare の Changelog で、Cache RulesVary レスポンスヘッダーをそのまま解釈できるようになったって発表があったの。

同じ 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 から設定できる

多言語サイトやコンテンツネゴシエーションを使ってる人、キャッシュヒット率をもう一段上げたい人にうれしいアップデートだよ!