HTTPヘッダーフィールド2

汎用ヘッダーフィールド

Cache-Control
Cache-Controlヘッダーフィールドは、ディレクティブと呼ばれるコマンドをフィールド値に指定することで、キャッシングの動作を指定する。Cache-Controlヘッダーフィールドのディレクティブはリクエストとレスポンスの両方で使用できる。

キャッシュコントロールリクエストディレクティブ
ディレクティブパラメータ説明
max-age必須レスポンスの最大Age値
max-stale省略可能期限切れのレスポンスを受け入れる
min-fresh必須指定した時間は新鮮さがあるレスポンスを望む
no-cacheなしオリジンサーバーへの強制的な再検証
no-storeなしキャッシュはリクエスト、レスポンスの一部分を保存してはならない
no-transformなしプロキシはメディアタイプを変換してはならない
only-if-cachedなしキャッシュからリソース取得
extension token - 新しいディレクティブのためのトーク



キャッシュコントロールレスポンスディレクティブ
ディレクティブパラメーター説明
max-age必須レスポンスの最大Age値
must-revalidateなしキャッシュ可能であるが、オリジンサーバーにリソースの再確認を要求する
no-cache省略可能有効性の再確認なしではキャッシュは使用してはならない
no-storeなしキャッシュはリクエスト、レスポンスお一部分を保存してはならない
no-transformなしプロキシはメディアタイプを変換してはならない
private省略可能特定ユーザーに対してのみレスポンス
proxy-revalidateなし中間キャッシュサーバーに対し、キャッシュしたレスポンスの有効性の再確認を要求
publicなしどこかにレスポンスキャッシュが可能
s-maxage必須共有キャッシュサーバーのレスポンスの最大Age値
extension tokens - 新しいディレクティブのためのトーク



max-cahceディレクティブ


Cache-Control: max-age=1000
  • クライアントからのリクエストでmax-ageディレクティブが使われていた場合、指定した値より古くない場合には、キャッシュされたリソースを受け入れることができる。

  • 指定した値が0なら、キャッシュサーバーはリクエストを常にオリジンサーバーに渡す必要がある。

  • サーバーからのレスポンスで、max-ageディレクティブが使われていた場合、キャッシュサーバーが有効性の再確認をせずに、リソースをキャッシュに保持しておくことができる最大時間を示す。

  • サーバーで、Cache-Controlヘッダーフィールドと同時にExpiresヘッダーフィールドがある場合、max-ageディレクティブの指定を優先し、Expiresヘッダーフィールドを無視する。HTTP/1.0のキャッシュサーバーの場合は、max-ageディレクティブが無視される。


  • max-staleディレクティブ


    Cache-Control: max-stale=1500
  • max-staleディレクティブが使用される場合、キャッシュされたリソースの有効期限が切れていても受け入れられることを伝える。ディレクティブに値が指定されていれば、有効期限が切れてから指定時間内であれば受け入れられることを伝える。


  • min-freshディレクティブ


    Cache-Control: min-fresh=30
  • min-freshディレクティブが使用されていると、キャッシュされたリソースが少なくとも指定された時間は新鮮であるものを返すようにキャッシュサーバーに要求する。"min-fresh=30"と指定されていれば、30秒以内で有効期限が切れるリソースをレスポンスとして返すことはできない。


  • must-revalidateディレクティブ


    Cache-Control: must-revalidate
  • must-revalidateディレクティブが使用されると、特定のレスポンスのキャッシュが、古くなっている可能性のある値を返せないと示すことができる。このときキャッシュサーバーが折りジンサーバーに対してリソースを要求する。キャッシュサーバーが折りジンサーバーに到達できない場合は、キャッシュサーバーはクライアントにエラーを返す。

  • must-revalidateディレクティブが使用される場合、リクエストでmax-staleディレクティブを使っていても無視する。



  • no-cacheディレクティブ

    クライアントの場合

    Cache-Control: no-cache
  • no-cacheディレクティブは、キャッシュから古いリソースが返されることを防ぐ目的で使われる。

  • クライアントからのリクエストでno-cacheディレクティブが使われると、キャッシュされたレスポンスをクラインとが受け付けない。

  • 中間のキャッシュサーバーは、リクエストをオリジンサーバーまで転送する必要がある

  • サーバーからのレスポンスでno-cacheディレクティブが使用されると、キャッシュサーバーはリソースを格納することができない。オリジンサーバーはキャッシュサーバーに対して、以後のリクエストはリソースの有効性の再確認をせずに、そのレスポンスを使用することを禁止する

  • サーバーからのレスポンスで、no-cacheのフィールド値にヘッダーフィールド名が指定されると、この指定されたヘッダーフィールドだけキャッシュすることができない。

  • 指定されたヘッダーフィールド以外はキャッシュできる。

  • no-cacheディレクティブのパラメータ指定はレスポンスディレクティブのみ使用可能

  • Cache-Control: no-cache=Location





    Cache-Control: no-store


    Cache-Control: no-store
  • no-storeディレクティブが使われると、リクエストまたはレスポンスに機密情報が含まれていることを示す。

  • キャッシュは「リクエスト、レスポンスの一部分をローカルストレージに保存してはならない」と指定している


  • no-transformディレクティブ


    Cache-Control: no-transform
  • no-transformディレクティブが使われると、リクエスト、レスポンスのいずれの場合も、キャッシュがエンティティボディのメディアタイプを変更しないように指定する。これにより、キャッシュサーバーなどで画像が圧縮されたりするのを防ぐ。


  • only-if-cachedディレクティブ


    Cache-Control: only-if-cached
  • only-if-cachedディレクティブが使われると、クライアントはキャッシュサーバーに対して、目的のリソースがローカルキャッシュにあるときだけレスポンスを返すように要求する。

  • キャッシュサーバーに対して、レスポンスのリロードや有効性の再確認をしたりしないように要求する

  • キャッシュサーバーがローカルキャッシュから応答できないと、"504 Gateway Timeout"ステータスを返す。



  • privateディレクティブ


    Cache-Control: private
  • privateディレクティブが使われると、レスポンスが特定ユーザーだけを対象にしていることを示す。キャッシュサーバーは、その特定ユーザーのためにリソースをキャッシュすることはできるが、他のユーザーから同じリクエストがきても、そのキャッシュを返さないようにする。


  • proxy-revalidateディレクティブ


    Cache-Control: proxy-revalidate
  • proxy-revalidateディレクティブが使われると、すべてのキャッシュサーバーに対して以後のリクエストで当該のレスポンスを返す場合には、必ず有効性の再確認をするように要求する


  • publicディレクティブ


    Cache-Control: public
  • publicディレクティブが使われると、他のユーザーにも返すことができるキャッシュをしてもよいことを明示的に示す。privateディレクティブの逆の働き。



  • s-maxageディレクティブ


    Cache-Control: s-maxage=1000
  • s-maxageディレクティブの機能は、max-ageディレクティブと同じで、複数ユーザーが利用できる共有キャッシュサーバーにだけ適用されるという点がことなる。

  • 同一ユーザーに対して繰り返しレスポンスを返すようなキャッシュサーバーに対しては無効なディレクティブ。

  • s-maxageディレクティブが使用されると、Expiresヘッダーフィールドとmax-ageディレクティブは無視される。



  • extension tokens


    Cache-Control: private, community="UCI"
  • Cache-Controlヘッダーフィールドは、extension tokensを使うことでディレクティブの拡張ができる

  • キャッシュサーバーが拡張されたディレクティブを理解できない場合は無視される

  • extension tokesは、理解できるキャッシュサーバーに対してのみ意味を持つ



  • 参考文献:今夜わかるHTTP(上野宣)