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

5.2.3. キャッシュ制御の拡張 (Cache Control Extensions)

Cache-Control ヘッダーフィールドは、それぞれオプションの値を持つ 1 つ以上のキャッシュ拡張トークンを使用して拡張できる。キャッシュは認識できないキャッシュディレクティブを無視しなければならない (MUST)。

情報拡張(キャッシュ動作の変更を必要としない拡張)は、他のディレクティブのセマンティクスを変更せずに追加できる。

動作拡張は、既存のキャッシュディレクティブの基盤への修飾子として機能することで動作するように設計されている。新しいディレクティブと標準ディレクティブの両方が提供されるため、新しいディレクティブを理解しないアプリケーションは標準ディレクティブで指定された動作にデフォルト設定され、新しいディレクティブを理解するアプリケーションは、それが標準ディレクティブに関連する要件を変更していることを認識する。このように、デプロイされたキャッシュを破壊することなく Cache-Control ディレクティブへの拡張を行うことができる。

例えば、private ディレクティブへの修飾子として機能する "community" と呼ばれる仮想の新しいレスポンスディレクティブを考える:プライベートキャッシュに加えて、名前付きコミュニティのメンバーのみによって共有される任意のキャッシュがレスポンスをキャッシュすることを許可される。UCI コミュニティが本来プライベートなレスポンスを共有キャッシュで使用できるようにしたいオリジンサーバーは、次を含めることでそれを実行できる:

Cache-Control: private, community="UCI"

このような community キャッシュ拡張を認識するキャッシュは、その拡張に従って動作を拡大できる。community キャッシュ拡張を認識しないキャッシュは、それを無視して private ディレクティブに従う。

5.3. 有効期限 (Expires)

"Expires" ヘッダーフィールドは、レスポンスが古いと見なされる日付/時刻を示す。鮮度モデルのさらなる議論については、セクション 4.2 を参照。

Expires フィールドの存在は、元のリソースがその時刻の前、その時刻、またはその時刻の後に変更されるか存在しなくなることを意味しない。

Expires フィールド値は、[RFC7231] のセクション 7.1.1.1 で定義されている HTTP 日付タイムスタンプである。

Expires = HTTP-date

例えば:

Expires: Thu, 01 Dec 1994 16:00:00 GMT

キャッシュ受信者は、無効な日付形式、特に値 "0" を、過去の時刻(つまり、「すでに期限切れ」)を表すものとして解釈しなければならない (MUST)。

レスポンスに max-age ディレクティブ(セクション 5.2.2.8)を含む Cache-Control フィールドが含まれている場合、受信者は Expires フィールドを無視しなければならない (MUST)。同様に、レスポンスに s-maxage ディレクティブ(セクション 5.2.2.9)が含まれている場合、共有キャッシュ受信者は Expires フィールドを無視しなければならない (MUST)。これらの両方の場合、Expires 内の値は、Cache-Control フィールドをまだ実装していない受信者のみを対象としている。

時計を持たないオリジンサーバーは、その値が過去の固定時刻(常に期限切れ)を表すか、その値が信頼できる時計を持つ他のシステムまたは人物によってリソースに関連付けられていない限り、Expires フィールドを生成してはならない (MUST NOT)。

歴史的に、HTTP は Expires フィールド値が未来 1 年以内であることを要求していた。より長い鮮度有効期間はもはや禁止されていないが、極端に大きな値(例えば、9999 年を超える未来の日付)は、タイムスタンプの解析と算術オーバーフローの問題を引き起こす可能性があるため、推奨されない。

5.4. プラグマ (Pragma)

"Pragma" ヘッダーフィールドは、HTTP/1.0 キャッシュとの下位互換性を可能にし、クライアントが理解する "no-cache" リクエストを指定できるようにする(Cache-Control は HTTP/1.1 まで定義されなかったため)。リクエスト内に Cache-Control ヘッダーフィールドも存在し理解される場合、Pragma は無視される。

HTTP/1.0 では、Pragma は受信者向けの実装固有ディレクティブのための拡張可能なフィールドとして定義されていた。この仕様では、HTTP/1.0 デプロイとの下位互換性以外の目的での Pragma の使用を非推奨とする。

Pragma = 1#pragma-directive
pragma-directive = "no-cache" / extension-pragma
extension-pragma = token [ "=" ( token / quoted-string ) ]

リクエスト内に Cache-Control ヘッダーフィールドが存在しない場合、キャッシュはリクエストの Pragma ヘッダーフィールドを考慮して "no-cache" ディレクティブが存在するかどうかを判断しなければならない (MUST)。

注:レスポンス内の "Pragma: no-cache" の意味が指定されていないため、それらの中で "Cache-Control: no-cache" の信頼できる代替を提供しない。送信者は、Cache-Control を含む HTTP/1.1 メッセージで Pragma を生成すべきではない (SHOULD NOT)。