メインコンテンツまでスキップ

2. ターゲット型Cache-Controlヘッダーフィールド

ターゲット型Cache-Controlヘッダーフィールド(以下「ターゲット型フィールド」)は、Cache-Controlレスポンスヘッダーフィールド([HTTP-CACHING]、セクション5.2)と同じセマンティクスを持つHTTPレスポンスヘッダーフィールドです。ただし、キャッシュディレクティブのターゲットを示す異なるフィールド名を持っています。

たとえば:

CDN-Cache-Control: max-age=60

は、セクション3で定義されているように、CDNに適用されるターゲット型フィールドです。

2.1. 構文

ターゲット型フィールドは、辞書構造化フィールド([STRUCTURED-FIELDS]のセクション3.2)です。辞書の各メンバーは、HTTPキャッシュレスポンスディレクティブ([HTTP-CACHING]のセクション5.2.2)であり、拡張レスポンスディレクティブ([HTTP-CACHING]のセクション5.2.3による)を含みます。ターゲット型フィールドはCache-Controlフィールドと同じ構文を持つことが多いですが、エラー処理の違いにより、構造化フィールドパーサーではなくCache-Controlパーサーを使用すると、相互運用性の問題が発生する可能性があることに注意してください。

キャッシュディレクティブは構造化データ型の観点から定義されていないため、それらの値を適切な型にマッピングする必要があります。[HTTP-CACHING]のセクション5.2では、キャッシュディレクティブ値を、不在、引用文字列、またはトークンのいずれかとして定義しています。

これは、値を持たないキャッシュディレクティブがブール値([STRUCTURED-FIELDS]のセクション3.3.6)にマッピングされることを意味します。値が引用文字列の場合、文字列([STRUCTURED-FIELDS]のセクション3.3.3)にマッピングされ、トークンの場合は、値の内容に応じて、トークン([STRUCTURED-FIELDS]のセクション3.3.4)、整数([STRUCTURED-FIELDS]のセクション3.3.1)、または10進数([STRUCTURED-FIELDS]のセクション3.3.2)にマッピングされます。

たとえば、max-ageディレクティブ([HTTP-CACHING]のセクション5.2.2.1)は整数値を持ちます。no-store([HTTP-CACHING]のセクション5.2.2.5)は常にブール値trueを持ちます。no-cache([HTTP-CACHING]のセクション5.2.2.4)は、ブール値trueまたはコンマ区切りのフィールド名リストを含む文字列のいずれかの値を持つことができます。

実装は、キャッシュディレクティブの値に対するこれらの推論された制約に違反する値を生成してはなりません(MUST NOT)。特に、最初の文字がアルファベットまたは「*」でない文字列値は、他の型と誤認されないように文字列として生成する必要があります(MUST)。

実装は、これらの推論された制約に違反する値を使用すべきではありません(SHOULD NOT)。たとえば、10進値を持つmax-ageを整数に強制変換する消費実装は、他の実装とは異なる動作をし、相互運用性の問題を引き起こす可能性があります。

明示的に指定されていない限り、キャッシュディレクティブで受信したパラメータは無視されます。

特定のレスポンスのターゲット型フィールドが空であるか、解析エラーが発生した場合、そのフィールドはキャッシュによって無視されなければなりません(MUST)(つまり、フィールドが存在しないかのように動作し、存在する他のキャッシュ制御メカニズムにフォールバックする可能性があります)。

2.2. キャッシュ動作

この仕様を実装するキャッシュは、ターゲットリストを維持します。ターゲットリストは、キャッシングポリシーに使用するターゲット型フィールド名の順序付きリストであり、順序は最も適用可能なものから最も適用できないものまでの優先順位を反映します。ターゲットリストは、実装に応じて、固定、ユーザー構成可能、またはリクエストごとに生成される場合があります。

たとえば、CDNキャッシュは、CDN-Cache-ControlとそのCDN固有のヘッダーExampleCDN-Cache-Controlの両方をサポートし、後者が前者を上書きする場合があります。そのターゲットリストは次のようになります:

[ExampleCDN-Cache-Control, CDN-Cache-Control]

この仕様を実装するキャッシュが、ターゲットリスト上の1つ以上のヘッダーフィールド名を持つレスポンスを受信すると、キャッシュは、有効で空でない値を持つ最初の(ターゲットリスト順)フィールドを選択し、その値を使用してレスポンスのキャッシングポリシーを決定する必要があり(MUST)、リストされたヘッダーフィールドから有効で空でない値が利用できない場合を除き、そのレスポンスのCache-ControlおよびExpiresヘッダーフィールドを無視する必要があります(MUST)。

これはレスポンスごとに発生することに注意してください。キャッシュのターゲットリストのメンバーが存在せず、有効で空でない場合、キャッシュはHTTP [HTTP-CACHING]で要求される他のキャッシュ制御メカニズムにフォールバックします。

キャッシュのターゲットリストにないターゲット型フィールドは、そのキャッシュの動作を変更してはならず(MUST NOT)、パススルーする必要があります(MUST)。

ターゲット型フィールドを使用するキャッシュは、次のキャッシュディレクティブのセマンティクスを実装する必要があります(MUST):

  • max-age
  • must-revalidate
  • no-store
  • no-cache
  • private

さらに、Cache-Controlレスポンスヘッダーフィールドでサポートする他のキャッシュディレクティブ(拡張キャッシュディレクティブを含む)を実装すべきです(SHOULD)。

ターゲット型フィールドのキャッシュディレクティブのセマンティクスと優先順位は、Cache-Controlのものと同じです。特に、no-storeno-cachemax-ageを無効にし、認識されない拡張ディレクティブは無視されます。

2.3. HTTPフレッシュネスとの相互作用

HTTPキャッシングには、[HTTP-CACHING]のセクション4.2で定義されている単一のエンドツーエンドフレッシュネスモデルがあります。追加のフレッシュネスメカニズムがリクエストパスに沿った一部のキャッシュ(たとえば、ターゲット型フィールドを使用)にのみ利用可能な場合、それらの相互作用を慎重に考慮する必要があります。特に、ターゲット型キャッシュは、他のキャッシュよりも長いフレッシュネスライフタイムを利用できる可能性があり、他のキャッシュにとって早期に(または即座に)古いと思われるレスポンスを提供し、キャッシュ効率に悪影響を与えます。

たとえば、CDNキャッシュによって保存されたレスポンスは、次のヘッダーで提供される場合があります:

Age: 1800
Cache-Control: max-age=600
CDN-Cache-Control: max-age=3600

CDNの観点からは、このレスポンスは30分間キャッシュされた後もまだ新鮮ですが、他のキャッシュの観点からは、このレスポンスはすでに古くなっています。詳細については、[AGE-PENALTY]を参照してください。

ターゲット型キャッシュが強力な一貫性メカニズム(たとえば、オリジンサーバーがキャッシュされたレスポンスを積極的に無効化する機能)を持っている場合、これらの影響を軽減することが望ましい場合がよくあります。デプロイメントで見られる一部の技術には、次のものがあります:

  • Ageヘッダーフィールドの削除
  • Dateヘッダーフィールド値を現在時刻に更新
  • Expiresヘッダーフィールド値を現在時刻にCache-Control: max-age値を加えたものに更新

この仕様は、これらの影響を軽減するための実装に対する特定の要件を課しませんが、ターゲット型フィールドの定義はそうすることができます。

2.4. ターゲット型フィールドの定義

特定のキャッシュクラスのターゲット型フィールドは、「ハイパーテキスト転送プロトコル(HTTP)フィールド名レジストリ」(<https://www.iana.org/assignments/http-fields/>)への登録を要求することで定義できます。

登録リクエストでは、この文書を仕様文書として使用できます。その場合、コメントフィールドには、ターゲット型フィールドが適用されるキャッシュのクラスを明確に定義する必要があります。あるいは、フィールドに対して他のドキュメントが作成されている場合は、それを仕様文書として使用できます。

慣例により、ターゲット型フィールドには「-Cache-Control」というサフィックスが付きます(例:「ExampleCDN-Cache-Control」)。ただし、このサフィックスは、ターゲット型フィールドを識別するために単独で使用してはなりません(MUST NOT)。これは単なる慣例です。

ターゲット型フィールドの定義は、HTTP仕様([HTTP]のセクション16.3.2)に従って、IANA「ハイパーテキスト転送プロトコル(HTTP)フィールド名レジストリ」(<https://www.iana.org/assignments/http-fields/&gt;)に登録されるべきです(SHOULD)。