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

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

## なにが発表されたの？

Cloudflare の Changelog で、[Cache Rules](https://developers.cloudflare.com/cache/how-to/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](https://developers.cloudflare.com/ruleset-engine/rulesets-api/) からできて、詳しい設定方法は [Cache Rules の Vary 設定](https://developers.cloudflare.com/cache/how-to/cache-rules/settings/#vary) にまとまってるよ。

Workers からもっと細かく制御したいときは、[`cf.vary`](https://developers.cloudflare.com/workers/runtime-apis/request/#the-cfvary-property) プロパティも合わせてどうぞ。

## まとめ

- 同じ URL で言語や形式ごとに違うレスポンスを、`Vary` ヘッダーを見てキャッシュし分けられるようになったよ
- normalize / passthrough / bypass の 3 つから、ヘッダーごとに挙動を選べる
- オリジンや Worker のコード変更は不要。バイパスしてたコンテンツもキャッシュできてヒット率アップ
- Free から Enterprise までの全プランで、ダッシュボードか Rulesets API から設定できる

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