このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
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月.
ETag (またはエンティティタグ)は HTTP のレスポンスヘッダーで、リソースの特定バージョンの識別子です。ウェブサーバーは、コンテンツが変更されていない場合はレスポンス全体を再送する必要がないので、キャッシュがより効率的になり通信帯域を節約することができます。加えて、 ETag はリソースが同時に更新されて互いを上書きすること (「空中衝突」) を防ぐのに役立ちます。
指定された URL のリソースが変更された場合は、新しいEtag 値を生成する必要があります。これらを比較することで、リソースの 2 つの表現が同じかどうかを素早く判断できます。
| ヘッダー種別 | レスポンスヘッダー |
|---|---|
| 禁止リクエストヘッダー | いいえ |
In this article
構文
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"ハッシュが一致しない場合は、文書が途中で編集されたことを意味し、412Precondition Failed エラーが発生します。
変更されていないリソースのキャッシュ
もう一つのETag ヘッダーの典型的な使用例として、変更されていないリソースをキャッシュすることがあります。ユーザーが (ETag が設定されている) 指定された URL を再度訪問した時、それが古くなったもの (古すぎて使用できない) であった場合、クライアントはIf-None-Match ヘッダー欄でETag の値を送ります。
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"サーバーは、クライアントのETag (If-None-Match で送信されたもの) を現在のバージョンのETag と比較し、両方の値が一致する (つまりリソースは変更されていない) 場合、サーバーは304Not Modified ステータスを本文なしで返送し、キャッシュされたレスポンスのバージョンがまだ使用可能 (新しい) であることをクライアントに通知します。
仕様書
| Specification |
|---|
| HTTP Semantics> # field.etag> |