参考: https://developer.mozilla.org/ja/docs/Web/HTTP/Guides/Conditional_requests
リクエストに前提条件を付け、満たされたときだけサーバーに実行させる仕組み。 条件は「リソースが今この状態か?」の判定で、判定材料を バリデーターと呼ぶ。
| バリデーター | 正体 |
|---|---|
ETag | サーバーが付けるリソースの版ID |
Last-Modified | 最終更新日時 |
ETag はどう作られるのか
仕様(RFC 9110 §8.8.3)は中身を決めていない。サーバーが好きに決める不透明な文字列で、クライアントは一致するかを見るだけ。実装は 2 派に分かれる。
- メタデータから作る — nginx は
"最終更新時刻-サイズ"を 16 進で並べるだけ("689f1a2c-1f4b")。本文を読まずに作れて速い - 本文のハッシュ — S3 の ETag は基本的に本文の MD5
ハッシュは本文全体を読む必要があるので、静的ファイル配信では前者が選ばれやすい。
キャッシュ検証で使うヘッダー
| ヘッダー | 成立条件 |
|---|---|
If-None-Match | ETag が一致しない |
If-Modified-Since | 指定日時より後に更新された(ETag がない場合の代替) |