If-None-Match
使い方
If-None-Match ヘッダーは、エンティティタグに基づくキャッシュの再検証を可能にします。クライアントは、以前のレスポンスで受け取った 1 つ以上の ETag 値を含めます。列挙した ETag のいずれかが現在のリソースと一致すれば、サーバーはボディのない 304 Not Modified レスポンスを返し、クライアントはキャッシュ済みのコピーを再利用します。いずれの ETag も一致しなければ、サーバーは更新後のコンテンツとともに通常の 200 レスポンスを送ります。
GET や HEAD のような安全なメソッドでは、これが主要なキャッシュ再検証の仕組みです。PUT のような安全でないメソッドでは、ワイルドカード * を用いた If-None-Match が既存のリソースの上書きを防ぎ、更新の喪失(lost update)問題を回避します。安全でないリクエストで一致が見つかった場合、サーバーは 412 Precondition Failed を返します。
同じリクエストに If-None-Match と If-Modified-Since の両方が現れる場合、If-None-Match が優先されます。エンティティタグは正確なコンテンツに結び付いた不透明な識別子であるのに対し、タイムスタンプの分解能は 1 秒で時計のずれの影響も受けるため、ETag に基づく比較のほうが信頼できます。
サーバーが 304 を返すとき、そのレスポンスには元の成功レスポンスに含まれていたヘッダーが含まれます。Cache-Control、Content-Location、Date、ETag、Expires、Vary です。
注意
Googlebot は、以前のレスポンスに ETag が含まれていた場合、クロールのリクエストに If-None-Match を送信します。変更のないコンテンツに対して 304 を返すサーバーは処理時間とリソースを節約でき、間接的にクロール効率が向上します。また、リクエストに条件付きヘッダーが含まれているかどうかに関わらず、コンテンツが変更されていなければサーバーは Googlebot のあらゆるリクエストに対して先回りして 304 を返しても構いません。Cache-Control レスポンスヘッダーの max-age フィールドに、コンテンツが変更されないと見込まれる秒数を設定しておくと、クローラーがいつ URL を再クロールすべきかを判断しやすくなります。
ETag 値
それぞれ二重引用符で囲まれた 1 つ以上の ETag 値です。複数の値はカンマで区切ります。強い ETag と(W/ を前置した)弱い ETag のどちらも有効です。
*(ワイルドカード)
ワイルドカード * は現在のあらゆるエンティティに一致します。PUT と併用して、すでにリソースが存在する場合に新規作成を防ぐために使います。
例
クライアントが単一の ETag を使ってキャッシュ済みのリソースを再検証します。リソースが指定されたエンティティタグと一致したままであれば、サーバーは 304 を返します。
If-None-Match: "abc123"
複数のキャッシュ済みバージョンを保持するクライアントが、既知のすべての ETag を送ります。サーバーはそれぞれを現在のリソースと照合します。いずれかが一致すれば、サーバーは 304 を返します。
If-None-Match: "abc123", "def456"
弱い ETag の比較です。弱い検証子はバイト単位の同一性ではなく意味的な等価性を示します。W/ の接頭辞が弱い比較であることを示します。
If-None-Match: W/"v2.6"
上書きを防ぐためにワイルドカードを使う PUT リクエストです。対象 URL にすでにリソースが存在する場合、サーバーは 412 Precondition Failed を返します。
PUT /api/resource HTTP/1.1
If-None-Match: *
注意
SEO とキャッシュに関する支援については、元 Google の SEO コンサルタント Search Brothers にご相談ください。