本文へ移動
技術を、自社の仕事に。
判断と実行を助けるメディア

記事を検索

言語で出し分けるページとCloudflareのVary

目次 · 5項目

トップページだけはブラウザの言語設定を見て日本語と英語を出し分けている。そのページを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 を次の手順でそろえると書かれています。

  1. 小文字にする
  2. 余分な空白を除く
  3. 優先度(q の値)の順に並べ、同じ優先度なら文字順にする
  4. パラメーターを除く
  5. 地域コードを除く(en-US は en に。同じ言語の地域違いは1つにまとめる)

CloudflareのVaryでAccept-Languageを正規化したときに、どの版のキャッシュが使われるかを示した図。「en-US, fr;q=0.8」と「fr;q=0.8, en-GB」はどちらも「en,fr」にそろい、同じキャッシュを使う。「fr, en;q=0.8」は「fr,en」となり、別の版になる。例はCloudflareのドキュメントのもの

図の例はドキュメントにあるものです。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 しか届かなくなる点に注意が必要です。

設定するときの手順(編集部の整理)

ここからはドキュメントの設定項目をもとにした編集部の整理です。実際のゾーンでは試していません。

  1. オリジンが Vary を返しているか確かめる。 Cloudflare側だけ設定しても、オリジンの応答に Vary がなければ版は分かれません
  2. 既定の扱いを bypass にする。 設定の vary を書くと default が必須になります。ドキュメントも、想定外のヘッダーで版が増えないよう、既定を bypass にして必要なヘッダーだけ個別に書く方法を勧めています
  3. 言語の一覧を絞る。 accept-language を normalize にし、languages にサイトの言語を入れます
  4. 繁体字と簡体字のように地域で分ける言語に気を付ける。 地域コードは既定で除かれます。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制作・リニューアルのご相談からお問い合わせください。

Sources

この記事を共有XFacebook
鈴木 翔

技術の可能性に魅了され、学生時代からプログラミングとデジタルアートの分野に深い関心を持つ

この記事のテーマを、自社の次の一歩へ

Webサイトで、実現したいことから。

使う人の目的、必要な機能、更新の体制を整理し、制作・改善で最初に取り組むことを考えます。

  • サイトの目的
  • 機能と使いやすさ
  • 公開後の運用
Web制作・改善を相談する

構想段階からご相談いただけます。この記事の情報を相談フォームに引き継ぎます。

最新記事をメールで受け取る・Web制作ガイドを読む
無料ダウンロード

Web制作 費用・発注・集客 完全ガイド【2026年版】

費用相場・制作会社の選び方・集客戦略をPDFにまとめました。

The PDF and newsletter emails are currently in Japanese.

メルマガにも登録されます。いつでも解除可能です。