トップページだけはブラウザの言語設定を見て日本語と英語を出し分けている。そのページをCDNでキャッシュすると、先に英語で開いた人の版が日本語の利用者にも返ってしまう。そこでこのページだけキャッシュを外し、毎回オリジンまで取りに行かせている。Cloudflareのchangelogも、これまで正しさを保つためにキャッシュを外す必要があったコンテンツを、キャッシュできるようになったと説明しています。
Cloudflareは、Cache Rulesでオリジンの Vary レスポンスヘッダーを扱えるようにしました。公式のchangelogの日付は2026年7月2日で、Free・Pro・Business・Enterpriseの全プランが対象です。CloudflareのドキュメントのリポジトリでVaryの説明と設定項目を読み、言語で出し分けるサイトで使う前に確かめる点をまとめます。
Varyで何が変わるのか
Vary は、同じURLでもリクエストヘッダーによって中身が変わることを、オリジンがキャッシュに伝えるためのHTTPヘッダーです。たとえばオリジンが Vary: Accept-Language を返すと、Accept-Language の値がキャッシュキーの一部になり、言語ごとに別の版が保存されます。
ドキュメントによると、Cache RulesでVaryを有効にしても、すべての応答が言語別に分かれるわけではありません。オリジンの応答に Vary ヘッダーがあるときだけ、そこに書かれたヘッダーが、設定した扱いに従ってキャッシュキーに加わります。Vary がない応答は従来どおりキャッシュされます。Vary: * は設定にかかわらずキャッシュされません。
ヘッダーごとに、次の3つの扱いから選びます。
| 扱い | 動き | 向いている場面 |
|---|---|---|
normalize | 意味が同じ値を同じキーにそろえる | Accept・Accept-Language・Accept-Encoding の多くの場合 |
passthrough | 値をそのままキーに使い、オリジンにもそのまま渡す | 1文字の違いでも別の版にしたいとき |
bypass | そのヘッダーが Vary にあればキャッシュしない | User-Agent など値の種類が多いもの、利用者ごとの値 |
Accept-Languageの「そろえ方」
言語の出し分けで使うのは normalize です。ドキュメントには、Accept-Language を次の手順でそろえると書かれています。
- 小文字にする
- 余分な空白を除く
- 優先度(
qの値)の順に並べ、同じ優先度なら文字順にする - パラメーターを除く
- 地域コードを除く(
en-USはenに。同じ言語の地域違いは1つにまとめる)

図の例はドキュメントにあるものです。en-US, fr;q=0.8 と fr;q=0.8, en-GB はどちらも en,fr になり、同じ版が返ります。一方、fr, en;q=0.8 は fr,en になり、別の版として保存されます。キーになるのは「第一言語」だけではなく、並び順を含めた言語の一覧です。
版が増えすぎないようにする
言語の組み合わせはブラウザごとに違うため、そのままでは版が増え、キャッシュに当たりにくくなります。languages に、オリジンが実際に出し分ける言語の一覧(最大20件)を書くと、それ以外の言語は除かれてからキーが作られます。日本語と英語だけのサイトなら ["ja", "en"] のように指定します。
すべての値が除かれて空になった場合、Cloudflareはそのヘッダー自体をオリジンへのリクエストから外します。ヘッダーがないときに返す言語を、オリジン側で決めておく必要があります。
オリジンに届くヘッダーも変わる
Accept と Accept-Language を normalize にすると、キャッシュに当たらなかったときにオリジンへ送るヘッダーも、そろえた値に書き換えられます(Accept-Encoding は「Respect Strong ETags」を有効にしている場合のみ)。ある値に合わせて作った応答が、別の利用者に誤って返るのを防ぐための動きです。オリジンの言語判定が en-US のような地域付きの値を前提にしていると、en しか届かなくなる点に注意が必要です。
設定するときの手順(編集部の整理)
ここからはドキュメントの設定項目をもとにした編集部の整理です。実際のゾーンでは試していません。
- オリジンが
Varyを返しているか確かめる。 Cloudflare側だけ設定しても、オリジンの応答にVaryがなければ版は分かれません - 既定の扱いを
bypassにする。 設定のvaryを書くとdefaultが必須になります。ドキュメントも、想定外のヘッダーで版が増えないよう、既定をbypassにして必要なヘッダーだけ個別に書く方法を勧めています - 言語の一覧を絞る。
accept-languageをnormalizeにし、languagesにサイトの言語を入れます - 繁体字と簡体字のように地域で分ける言語に気を付ける。 地域コードは既定で除かれます。
languagesに地域付きの値を書いておくと、リクエストに一致するものがあれば地域コードが残ると説明されています
"vary": {
"default": { "action": "bypass" },
"headers": {
"accept-language": { "action": "normalize", "languages": ["ja", "en"] }
}
}
ヘッダー名は小文字で書き、cf- で始まる名前や host・cache-control などは指定できません。個別に書けるヘッダーは50件までです。
検索エンジンに言語別のページを認識させるには、言語ごとにURLを分ける設計も検討対象です。同じURLで出し分けるか、URLを分けるかは、Webサイトの多言語対応ガイドで比較しています。
落とし穴
- 設定を変えたら古い版が混ざると思う。 設定の変更自体はキャッシュを消しません。新しいキーで取り直されるまで、古い版は期限切れかパージまで残ります
- 言語ごとにパージが必要だと思う。 URLをパージすると、そのURLのすべての版が消えます。更新後の反映の仕方はパージと無効化の使い分けを参照してください
- 画像の形式の出し分けと混同する。 既存の「Vary for images」は別の機能で、今回の設定とは独立しています
2026年10月3日に、cloudflare/cloudflare-docsリポジトリ(commit 36706c5)のchangelog「Cache multiple versions of a URL with Vary」(2026-07-02)と「Workers fetch requests now support cf.vary」(2026-06-28)、ドキュメント「Vary」と「Cache Rules settings」の該当部分を直接開いて照合しました。公開前の2026年10月5日に、developers.cloudflare.comの公開ページ(changelog・Vary・Cache Rules settings)でも同じ記載を確かめました。実際のゾーンでの設定と、キャッシュの当たり方は検証していません。
多言語サイトの構成やCDNの設定の見直しは、HP制作・リニューアルのご相談からお問い合わせください。









