情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

サーバサイドウェブ開発基礎 HTTP詳説 キャッシュ

クライアントやプロキシはHTTPレスポンスをキャッシュしておくことができます。

他のクライアントと共有される可能性のあるキャッシュをシェアードキャッシュと言い、共有される可能性のないキャッシュをプライベートキャッシュと言います。

また、キャッシュが行われてから経過した秒数を年齢と言います。

キャッシュはキャッシュが行われた時点では新鮮ですが、ある程度の時間が経過すると新鮮でないものとなります。

クライアントやサーバはキャッシュしたHTTPレスポンスが更新されていないかを確認することができます。確認を行った場合にはキャッシュの年齢は0に戻ります。そのため、新鮮でなかったキャッシュも新鮮なキャッシュに戻ります。

Ageヘッダフィールド

AgeヘッダフィールドはキャッシュされたHTTPレスポンスにおいて設定するヘッダフィールドであり、Ageヘッダフィールドの値にはキャッシュの年齢を10進数として指定します。

Expiresヘッダフィールド

ExpiresヘッダフィールドはキャッシュされたHTTPレスポンスにおいて設定できるヘッダフィールドであり、Expiresヘッダフィールドの値にはキャッシュが新鮮でなくなる日時をHTTP日時として指定します。

Cache-Controlヘッダフィールド

Cache-ControlヘッダフィールドはHTTPリクエストやHTTPレスポンスにおいて設定できるヘッダフィールドであり、クライアントやサーバがキャッシュに関する情報をサーバやクライアントに通知するために使用することができます。

Cache-Controlヘッダフィールドの値には1個以上のキャッシュに関するパラメータのリストを,区切りで指定します。

パラメータに値を付加する場合にはパラメータの末尾に=と値を付加します。

HTTPリクエストのCache-Controlヘッダフィールドに指定することのできるパラメータには下のようなものがあります。

  • max-age・・・年齢がパラメータの値以下である新鮮なキャッシュが受け入れ可能であることを示します。
  • max-stale・・・新鮮でなくなってからの経過秒数がパラメータの値以下であるキャッシュが受け入れ可能であることを示します。ただし、パラメータの値が指定されていない場合には全ての新鮮でないキャッシュが受け入れ可能であることを示します。
  • min-fresh・・・新鮮でなくなるまでの残り秒数がパラメータの値以上であるキャッシュが受け入れ可能であることを示します。
  • no-cache・・・最新のHTTPレスポンスを表していることが確認されたキャッシュのみが受け入れ可能であることを示します。
  • no-store・・・キャッシュが受け入れ可能でないことを示します。
  • no-transform・・・ボディのデータが変更されたキャッシュが受け入れ可能でないことを示します。
  • only-if-cache・・・キャッシュ以外は受け入れ可能でないことを示します。キャッシュ機能を有するプロキシがキャッシュを保持していなかった場合にはステータスコードが504Gateway Timeout)のHTTPレスポンスを返信するようにします。

HTTPレスポンスのCache-Controlヘッダフィールドに指定することのできるパラメータには下のようなものがあります。

  • must-revalidate・・・キャッシュが新鮮でなくなっている場合にはキャッシュが最新のHTTPレスポンスを表していることを確認してからキャッシュを送信しなければならないことを示します。
  • no-cache・・・キャッシュが新鮮であるかどうかに拘わらずキャッシュが最新のHTTPレスポンスを表していることを確認してからキャッシュを送信しなければならないことを示します。ただし、パラメータの値に1個以上のヘッダフィールドのフィールド名のリストが,区切りで"で囲んで指定されている場合にはキャッシュがパラメータの値に指定されているヘッダフィールドを少なくとも1つ含む場合にのみキャッシュが最新のHTTPレスポンスを表していることを確認してからキャッシュを送信しなければならないことを示します。
  • no-store・・・HTTPレスポンスをキャッシュしてはならないことを示します。
  • no-transform・・・キャッシュの際にHTTPレスポンスのボディのデータを変更してはならないことを示します。
  • public・・・キャッシュできないとされているステータスコードのHTTPレスポンスやプライベートでしかキャッシュできないとされているHTTPレスポンスがシェアードでキャッシュ可能であることを示します。
  • private・・・プライベートでしかHTTPレスポンスをキャッシュしてはならないことを示します。ただし、パラメータの値に1個以上のヘッダフィールドのフィールド名のリストが,区切りで"で囲んで指定されている場合にはパラメータの値に指定されているヘッダフィールドに関してのみプライベートでしかキャッシュしてはならないことを示します。
  • proxy-revalidate・・・プライベートでないキャッシュが新鮮でなくなっている場合にはキャッシュが最新のHTTPレスポンスを表していることを確認してからキャッシュを送信しなければならないことを示します。
  • max-age・・・年齢がパラメータの値より大きいキャッシュは新鮮でないものとなることを示します。これはExpiresヘッダフィールドの設定より優先します。
  • s-maxage・・・年齢がパラメータの値より大きいプライベートでないキャッシュは新鮮でないものとなることを示します。これはmax-ageパラメータの設定やExpiresヘッダフィールドの設定より優先します。また、プライベートでないキャッシュが新鮮でなくなっている場合にはキャッシュが最新のHTTPレスポンスを表していることを確認してからキャッシュを送信しなければならないことも示します。

Pragmaヘッダフィールド

PragmaヘッダフィールドはHTTPリクエストにおいて設定できるヘッダフィールドであり、Pragmaヘッダフィールドの値にはno-cacheを指定します。

Pragmaヘッダフィールドの値にno-cacheを指定するのはCache-Controlヘッダフィールドの値にno-cacheを指定するのと同じ効果を有します。

ただし、Cache-Controlヘッダフィールドが設定されている場合にはCache-Controlヘッダフィールドの設定が優先します。

警告

キャッシュには下のような警告を付加するようにします。

  • 110Response is Stale)・・・新鮮でないキャッシュに付加します。
  • 111Revalidation Failed)・・・最新のHTTPレスポンスを表しているかの確認が失敗した新鮮でないキャッシュに付加します。
  • 112Disconnected Operation)・・・キャッシュ機能を有するプロキシのインバウンドの接続が切断されている場合に付加します。
  • 113Heuristic Expiration)・・・新鮮であるかどうかがキャッシュ機能を有するプロキシによって決定されており、しかも、年齢が24時間より大きいキャッシュに付加します。
pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-http, web