ETag ヘッダー
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
HTTP の ETag (エンティティタグ)レスポンスヘッダーは、リソースの特定バージョンの識別子です。
これにより、キャッシュの効率が向上し、帯域幅を節約できます。コンテンツが変更されていない場合、ウェブサーバーは完全なレスポンスを再送信する必要がないためです。
さらに、 ETag はリソースの同時更新による上書き(空中衝突)を防止するのに役立ちます。
指定された URL のリソースが変更された場合は、新しい ETag 値を生成する必要があります。これらを比較することで、リソースの 2 つの表現が同じかどうかを素早く判断できます。
| Header type | レスポンスヘッダー, 表現ヘッダー |
|---|---|
| 禁止リクエストヘッダー | いいえ |
構文
ETag: W/"<etag_value>"
ETag: "<etag_value>"
ディレクティブ
W/省略可-
W/(大文字) は弱いバリデーターを使用することを示します。 弱い ETag は生成が簡単ですが、比較にはあまり役立ちません。 強力なバリデーターは比較には理想的ですが、効率的に生成するのはとても困難です。 同じリソースを表現する 2 つの弱いETagの値があった場合、意味的には同等ですが、バイト単位では同じではない可能性があります。 すなわち、弱い ETag はバイト範囲指定のリクエストが行われたときにキャッシュされませんが、強い ETag は範囲指定のリクエストもキャッシュします。 <etag_value>-
リクエストされたリソースを一意に表すエンティティタグです。これは二重引用符で囲まれた ASCII 文字列であり、
"675af34563dc-tr34"のような形です。ETag値を生成する方法は指定されていません。 コンテンツのハッシュ、最終更新タイムスタンプのハッシュ、単なるリビジョン番号などがよく使用されます。 例えば、 Wiki エンジンは、文書内の記事コンテンツの 16 進ハッシュを使用することがあります。
例
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"
空中衝突の回避
ETag と If-Match ヘッダーの助けを借りて、編集の空中衝突を検出することができます。
たとえば、 MDN を編集する場合、現在の Wiki コンテンツのハッシュが算出され、そのレスポンスで Etag に入れられます。
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Wiki ページに変更を保存 (データの投稿) するとき、 POST リクエストには、 If-Match ヘッダーに ETag 値を入れて、新しいかどうかをチェックします。
If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ハッシュが一致しない場合は、文書が途中で編集されたことを意味し、 412 Precondition Failed エラーが発生します。
変更されていないリソースのキャッシュ
もう一つの ETag ヘッダーの典型的な使用例として、変更されていないリソースをキャッシュすることがあります。
ユーザーが (ETag が設定されている) 指定された URL を再度訪問した時、それが古くなったもの (古すぎて使用できない) であった場合、クライアントは If-None-Match ヘッダー欄で ETag の値を送ります。
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
サーバーは、クライアントの ETag (If-None-Match で送信されたもの) を現在のバージョンの ETag と比較し、両方の値が一致する (つまりリソースは変更されていない) 場合、サーバーは 304 Not Modified ステータスを本文なしで返送し、キャッシュされたレスポンスのバージョンがまだ使用可能 (新しい) であることをクライアントに通知します。
仕様書
| Specification |
|---|
| HTTP Semantics> # field.etag> |