Cloudflareは、すべてのプラン(Free、Pro、Business、Enterpriseを含む)で、Cache Rules機能にHTTPレスポンスヘッダーVaryのサポートを追加したと発表しました。この追加により、サイト管理者は、言語、画像形式、コンテンツタイプ、圧縮方式などの違いによって同一リソースの複数の表現が生成される可能性があるリクエストを、ネットワークがどのように処理するかを、より細かく制御できます。
オリジンサーバーはVaryを通じて、レスポンスに影響を与える可能性のあるリクエストヘッダーを指定します。しかし、このヘッダーは、それらのヘッダー値におけるすべての文字列上の違いが、実際に異なるレスポンスにつながるかどうかまでは示しません。そのため、キャッシュシステムが近似した値を別々のバージョンとして扱い、コンテンツが再利用性の低い多数の要素に分割される可能性があります。
違いを処理する3つの方法
Cloudflareでは、オリジンがVaryで指定する各ヘッダーについて、次の3つの処理のいずれかを選択できます。
- normalize:保存するバージョンを選択する前に値を正規化します。Accept、Accept-Language、Accept-Encodingなど、数多くの値が限られた数のレスポンスに集約されるネゴシエーション用ヘッダーに推奨される方式です。
- passthrough:大文字・小文字、空白、順序、重複値を含め、生の値を使用します。正確な違いがレスポンスに影響する場合に適しています。
- bypass:Varyで指定されたヘッダーが個人固有または多様性の高いものである場合、そのレスポンスを保存しません。例としてCookieやUser-Agentがあります。
Vary: *は常にキャッシュをバイパスします。これは、IPアドレスなど、HTTPメッセージ外の情報を含むリクエストのあらゆる部分が、オリジンによるレスポンスの選択に影響する可能性があるためです。
実際に何が変わるのか
正規化を使用すると、見た目は異なるものの同じ結果を優先するリクエストが、保存された同一のバージョンを共有できます。CloudflareはAccept、Accept-Language、Accept-Encodingの値を統一された形式に変換し、値を小文字にしたうえで品質の優先度に従って並べ替え、品質が同じ場合はアルファベット順に並べます。また、管理者はtext/htmlやapplication/json、あるいはen、fr、deなど、対応するメディアタイプや言語を指定できます。
ただし、この動作によってオリジンが必要とする違いが失われる可能性があります。Cloudflareによると、短縮処理の際にq=0の値や一部の言語除外指定が失われる可能性があるため、オリジンがクライアントから送信された除外指定をそのまま確認する必要がある場合は、passthroughを使用すべきです。また、生の値を通過させると、再び断片化の問題が生じる可能性があります。たとえば、compact,fullとcompact, fullは、オリジンが同等のものとして扱っている場合でも、異なるキャッシュキーを生成する可能性があります。
オリジンの責任と更新の制限
オリジンは、リクエストヘッダーに応じて異なる可能性がある、保存可能なすべてのレスポンスについて、フォールバックレスポンスやエラーレスポンスを含め、Varyを一貫して返す必要があります。いずれかのレスポンスで適切なヘッダーが欠落すると、Cloudflareは必要な分離を行わずにそのレスポンスを保存する可能性があります。
Varyの設定を変更しても、既存のコンテンツが自動的に削除されることはありません。古いエントリーは、有効期限が切れるか、purge処理を実行するまで残る可能性があります。また、Varyの設定は、すべてのケースでカスタムキャッシュキーの代わりになるわけではありません。Cloudflareは、リクエストの特性がリソースの識別情報の固定的な一部である場合にはカスタムキーを使用し、オリジンがレスポンスによって実際に影響するフィールドを通知する場合にはVaryを使用することを推奨しています。
なぜこのニュースが重要なのか
この更新はCDNにおける実務上のトレードオフに対処します。Varyを無視すると、誤った形式や言語がクライアントに送信される可能性がある一方、すべての値を文字どおりに扱うと、キャッシュヒット率が低下し、オリジンへの再リクエストが増加する可能性があります。記事によると、約5万の一般的なウェブサイトから収集した1億2,000万件を超えるレスポンスの分析では、約3,000サイトが4つ以上のフィールドを通じてバリエーションを使用しており、その一部では10、23、または47個のフィールドが使用されていました。
メリットは、オリジンが提供する表現をどれだけ適切に定義しているか、また各ヘッダーに適切な処理を選択できるかに左右されます。設定はCloudflareのダッシュボード、Rulesets API、またはTerraformから利用でき、デプロイ後には異なる値をテストし、CF-Cache-Statusを監視する必要があります。