[2] キャッシュに蓄積されるデータの単位をキャッシュ項目といいます。
- [1] RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching ( 版) <https://tools.ietf.org/html/rfc7234#section-2>
 - [125] RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching ( 版) <https://tools.ietf.org/html/rfc7234#section-3.1>
 - [23] RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching ( 版) <https://tools.ietf.org/html/rfc7234#section-4>
 - [93] RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching ( 版) <https://tools.ietf.org/html/rfc7234#section-5.2>
 - [39] RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching ( 版) <https://tools.ietf.org/html/rfc7234#section-5.4>
 - [96] RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching ( 版) <https://tools.ietf.org/html/rfc7234#section-5.5>
 - [136] RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing ( 版) <https://tools.ietf.org/html/rfc7230#section-2.6>
 - [139] RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing ( 版) <https://tools.ietf.org/html/rfc7230#section-3.2.4>
 - [85] RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing ( 版) <https://tools.ietf.org/html/rfc7230#section-5.7.2>
 - [121] RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content ( 版) <https://tools.ietf.org/html/rfc7231#section-6.6.3>
 - [131] RFC 7231 - Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content ( 版) <https://tools.ietf.org/html/rfc7231#section-7.1.1.2>
 - [127] RFC 7232 - Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests ( 版) <https://tools.ietf.org/html/rfc7232#section-2.3>
 - [163] RFC 7232 - Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests ( 版) <https://tools.ietf.org/html/rfc7232#section-4.1>
 - [166] RFC 5861 - HTTP Cache-Control Extensions for Stale Content ( 版) <http://tools.ietf.org/html/rfc5861#section-3>
 - [168] RFC 5861 - HTTP Cache-Control Extensions for Stale Content ( 版) <http://tools.ietf.org/html/rfc5861#section-4>
 - [177] RFC 3229 - Delta encoding in HTTP ( 版) <http://tools.ietf.org/html/rfc3229#section-10.6>
 
[8] キャッシュ可能性、検証、条件付き要求、部分要求も参照。
[10] キャッシュからの応答の決定は、次のように行います。
- [12] エラーその他の応答を返す場合、
HTTP認証によりエラーを返す場合などは、
そちらの方法で処理し、ここで終わります。
 - [32] 使う応答を「上流の応答」とします。
 - [24] キャッシュ項目として蓄積された応答から実効要求URLが一致するものがあれば >>23、
- [25] 
Vary: ヘッダーの条件が一致するもの
(Vary: 参照。) のみに限定します >>23。 - [26] 蓄積された応答の要求メソッドが現在の要求の要求メソッドに再利用できるものに限定します >>23。
 - [126] 現在の要求が求めている範囲をカバーできない不完全な応答や
206 応答 >>125、 266
応答 >>177 は除外します。 - [178] 
266 応答の場合、その再利用の制限を満たさないものは除外します
>>177。 - [27] 候補が複数ある場合は、次のいずれかとします >>23。
 - [30] ここで、候補が1つの場合は、
- [89] 候補の複製を応答とします。
 - [90] 使う応答を「キャッシュ応答」とします。
 
 
 - [31] 使う応答が「キャッシュ応答」の場合、
- [69] 時計がない場合、検証必要フラグを設定します >>23。
 - [13] それ以外の場合、
- [19] 齢を計算し、その結果を応答に 
Age:
ヘッダーとして追加 (既にあれば置換) します (齢参照)。 - [14] 明示的満期時刻がある場合、これを使って新鮮寿命を決定します。
 - [15] そうでない場合、
- [16] 発見的満期時刻を使って新鮮寿命を決定します。
 - [17] 新鮮寿命が24時間を超えていて、応答に警告符号 
113 の
Warning: ヘッダーがなければ、追加します
(新鮮寿命参照)。 
 - [20] 次のいずれかを満たす場合には、検証必要フラグを設定します。
 
 
 - [47] 検証必要フラグが設定されている場合、
- [97] 要求に 
Cache-Control: only-if-cached
があれば、使う応答を「エラー応答」とします >>93, >>38。 - [91] それ以外の場合、
- [108] 要求の複製を転送要求とします。
 - [142] 要求のプロトコルの版を自身が対応する最高の版に書き換えます >>136。
版の変更による書き換えが必要なら、適宜行います。
 - [145] ヘッダー名と 
: の間に空白があれば、除去します
>>139。 - [146] 
obs-fold があれば置換します >>139。 - [160] 
Transfer-Encoding:, Content-Length:,
Connection:, Via:, X-Forwarded-*:, Forwarded:, Host:,
Proxy-Authorization:, TE:, Max-Forwards:, Meter:, RFC 2774
各ヘッダーや要求対象のホスト部分に関する書き換えを適宜行います (それぞれの項を参照)。 - [128] 応答に 
ETag: が含まれていれば、
If-None-Match: か If-Match:
にその実体タグを指定します >>127。 - [109] 応答に 
Last-Modified: が含まれていれば、- [130] 範囲要求で応答が HTTP/1.0 なら、 
If-Unmodified-Since:
に Last-Modified: の値を設定します >>106。 - [129] それ以外なら、 
If-Modified-Since:
に Last-Modified: の値を設定します >>106。 
 - [115] 転送要求を上流に転送します。
 - [167] 応答に 
Cache-Control: stale-while-revalidate
があってその秒数と新鮮寿命の和より齢が大きくないなら、
上流からの応答がなかったものとして先に進むと共に、
並列に上流からの最終的な応答を待ち、受信した時の処理(のみ)を行います >>166。 - [98] 上流からの最終的な応答を受信したら、
- [122] 不正な応答なら、応答を得られなかったとします。
 - [116] 
304 応答なら、- [164] 蓄積された応答を更新します >>106 (条件付き要求参照)。
 - [165] 元の要求が条件付き要求だった場合を除き >>163、
更新結果を上流からの応答とします >>106, >>107。
 
 - [117] 
5xx 応答なら、応答を得られなかったとして構いません
>>107。 
 - [118] 上流からの応答がある場合、
- [132] 時計があり、上流からの応答に 
Date: がないなら、
Date: ヘッダーを追加します >>131。 - [119] 上流からの応答がキャッシュ可能で要求によって禁止されていないなら、
蓄積された応答を上流からの応答により置換して構いません >>107。
 - [120] 上流からの応答を応答とします >>107。
 - [100] 使う応答を「検証済み応答」に設定します。
 - [105] 応答に警告符号が 
1xx の Warning:
ヘッダーがあれば、削除します >>96。 
 - [21] それ以外の場合、
- [58] 次のいずれかを満たす場合には、使う応答を「エラー応答」に設定します。
 - [40] それ以外で、要求に 
Cache-Control: max-stale
が指定されている場合、- [42] 値が指定されている場合、齢と新鮮寿命の差が指定された値以下なら、
使う応答を「腐敗応答」に設定します >>50。
それ以外なら、使う応答を「エラー応答」に設定します。
 - [44] 値が指定されていない場合、使う応答を「腐敗応答」に設定します >>50。
 
 - [41] そうでない場合、
- [55] 要求に 
Cache-Control: max-age が指定されていない場合
>>54、- [169] 使う応答を「腐敗応答」に設定します。
 
 - [170] それ以外なら、
- [171] 要求または応答またはその両方に
Cache-Control: state-if-error があり、
いずれもその秒数と新鮮寿命の和より齢が大きくないなら、
使う応答を「腐敗応答」に設定します >>168。 - [173] それ以外なら、使う応答を「エラー応答」に設定します。
 
 - [51] それ以外の場合、使う応答を「腐敗応答」に設定します。
 
 
 
 
 - [67] 使う応答が「上流の応答」または「無キャッシュ上流の応答」の場合、
- [92] 要求に 
Cache-Control: only-if-cached
があれば、使う応答を「エラー応答」とします >>93, >>38。 - [94] それ以外の場合、
- [68] 転送要求を要求の複製とします。
 - [147] 要求のプロトコルの版を自身が対応する最高の版に書き換えます >>136。
版の変更による書き換えが必要なら、適宜行います。
 - [148] ヘッダー名と 
: の間に空白があれば、除去します
>>139。 - [149] 
obs-fold があれば置換します >>139。 - [150] 
Transfer-Encoding:, Content-Length:,
Connection:, Via:, Host:,
Proxy-Authorization:, TE:, Max-Forwards:, X-Forwarded-*:, Forwarded:, Meter:, RFC 2774
各ヘッダーや要求対象のホスト部分に関する書き換えを適宜行います (それぞれの項を参照)。 - [88] 使う応答が「無キャッシュ上流の応答」なら、転送要求に 
Cache-Control: max-age=0
または Cache-Control: no-cache を追加します >>23。 - [65] 転送要求を要求として上流に送信します。
 - [153] 
1xx 応答を受信したら、それぞれについて、- [154] 不正な応答の場合、使う応答を「エラー応答」に設定します。
 - [155] それ以外の場合、
- [156] 時計があり、上流からの応答に 
Date: がないなら、
Date: ヘッダーを追加します >>131。 - [157] 要求のプロトコルの版を自身が対応する最高の版に書き換えます >>136。
版の変更による書き換えが必要なら、適宜行います。
 - [158] ヘッダー名と 
: の間に空白があれば、除去します
>>139。 - [159] 
obs-fold があれば置換します >>139。 - [161] 
Transfer-Encoding:, Content-Length:,
Connection:, Via:, Meter:, RFC 2774
各ヘッダーに関する書き換えを適宜行います (それぞれの項を参照)。 - [162] 下流に送信します。
 
 
 - [66] 上流からの最終的な応答を受信したら、
- [123] 不正な応答の場合、使う応答を「エラー応答」に設定します。
 - [124] それ以外の場合、
- [135] 時計があり、上流からの応答に 
Date: がないなら、
Date: ヘッダーを追加します >>131。 - [134] 上流からの応答がキャッシュ可能で要求によって禁止されていないなら、
蓄積された応答を更新したり、新規に蓄積したりして構いません。
 - [133] 上流からの応答を応答に設定します。
 
 
 - [33] 受信できなかった場合は、使う応答を「エラー応答」に設定します。
 
 
 - [34] 使う応答が「上流の応答」か「検証済み応答」の場合、
- [137] 応答のプロトコルの版を、要求と自身が対応する最高の版に書き換えます
>>136。
版の変更による書き換えが必要なら、適宜行います。
 - [140] ヘッダー名と 
: の間に空白があれば、除去します
>>139。 - [143] 
obs-fold があれば置換します >>139。 - [151] 
Transfer-Encoding:, Content-Length:,
Connection:, Via:, Meter:, RFC 2774
各ヘッダーに関する書き換えを適宜行います (それぞれの項を参照)。 
 - [79] 使う応答が「キャッシュ応答」または「腐敗応答」の場合、
- [138] 応答のプロトコルの版を、要求と自身が対応する最高の版に書き換えます
>>136。
版の変更による書き換えが必要なら、適宜行います。
 - [141] ヘッダー名と 
: の間に空白があれば、除去します
>>139。 - [144] 
obs-fold があれば置換します >>139。 - [152] 
Transfer-Encoding:, Content-Length:,
Connection:, Via:, Meter:, RFC 2774
各ヘッダーに関する書き換えを適宜行います (それぞれの項を参照)。 - [76] 応答に 
Cache-Control: no-cache があって、
ヘッダー名が指定されている場合、- [77] 応答から指定されているヘッダーをすべて削除します >>73。
 
 - [56] 使う応答が「腐敗応答」の場合、
- [45] 応答に警告符号 
110 の 
Warning: ヘッダーを追加します >>46, >>36。 - [52] 意図的に切断されていた場合には、
応答に警告符号 
112 の 
Warning: ヘッダーを追加します >>49, >>36。 - [57] 上流への接続に失敗した場合には、
応答に警告符号 
111 の 
Warning: ヘッダーを追加します >>43, >>36。 
 
 - [59] 使う応答が「エラー応答」の場合、
- [70] 上流から不正な応答を受信して「エラー応答」に設定された場合、
新しい 
502 応答を応答とします >>121。 - [18] それ以外の場合、新しい 
504 応答を応答とします >>104, >>101。 
 - [37] 要求または応答に 
Cache-Control: no-transform
が含まれない場合で、変形を適用したい場合、- [86] 変形を適用します >>85。
 - [35] 警告符号 
214 の Warning:
ヘッダーを (なければ) 追加します >>85。 - [87] 状態符号が 
200 なら、 203
に変更しても構いません >>85。 
 - [99] エラーの応答やリダイレクトの応答の場合、
それを返してここで終わります。 >>18
 - [11] 使う応答が「キャッシュ応答」または「腐敗応答」なら、
要求に事前条件があれば適用します。真なら、あるいは事前条件がなければ、
応答を返します。詳しくは条件付き要求を参照。