汎用ヘッダーフィールド
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(上野宣)