[13] 実体タグは、 同じ資源の複数の表現が異なるかどうか、 資源の状態が時を経て変化したり、 内容折衝によって同時に妥当な表現が複数存在していたり、 その両方が起こったりしても区別できるような不透明な検証子です >>11。
[23] 実体タグは、修正日時の秒の精度では不十分だったり、 修正日時を一貫して維持できなかったりして修正日時では不便な状況で、 修正日時より信頼できる検証子として使うことができます >>11。
[17] 実体タグは、 "
で括られた文字列か、
W/
の後に "
で括られた文字列を続けたものです。
"
の間には、 "
と SPACE
以外のASCII文字を使うことができます。 >>11
[21] RFC 2616 までは "
の部分は引用文字列だったので、
受信者によっては \
の unescape を行います。
鯖は \
を避けるべきです。 >>11
[22] RFC 2616 までは W
は小文字でも構文上構わないことになっていましたが、
RFC 7232 で特に説明もなく禁止されました。 "
で括られた部分での空白や制御文字の使用も同じく禁止されています。
[32] 現実には、 "
で括られていない文字列が使われることもあります。
[29] W/
から始まるものは弱い検証子で、そうでないものは強い検証子です。
残りの部分は不透明な識別子で、起源鯖が任意の方法で決定できます。
[9] 透過内容折衝を使った応答では、実体タグは構造化実体タグでなければなりません >>10。
[30] 起源鯖は実体タグが強い検証子の性質を満たさない時は、
W/
を指定しなければなりません >>11。
[41] Metalink/HTTP では、一連の鯖の間で実体タグのポリシーを共通化することが求められています >>34。
[35] 実体タグは ETag:
ヘッダーの他、
If-Match:
ヘッダーや
If-None-Match:
ヘッダーや
If-Range:
ヘッダー、
Delta-Base:
ヘッダー、
If:
ヘッダーでも使われます。
[20] WebDAV (や編集目的) の場合にはとりわけ Last-Modified:
のタイムスタンプよりも実体タグが、また弱い実体タグより強い実体タグが好ましいと考えられています >>19。
[46] 起源鯖は、以前の表現が現在の表現のかわりに使われてしまってはいけない時には弱い実体タグを変更するべきです。 >>47
[25] PUT
応答における実体タグが要求で指定された
payload body と完全に一致するものに対するものなのか、
鯖側での軽微な変更も認められるのかは定かではありません >>19。
[26] WebDAV 鯖は本体や URL が変わっていない資源の実体タグを変えるべきではありません >>19。
[40] WebDAV 鯖は、 (COPY
や MOVE
などの URL を操作するメソッドの結果であろうと、) GET
が返すであろう表現が異なる場合には実体タグを再利用してはなりません。 >>27
[38] 実体タグの比較には、強い比較と弱い比較があります。
強い比較は両者とも弱くなく、文字の列として一致する時等価とします。
弱い比較は W/
の有無に関わらず、残りの部分が文字の列として一致する時等価とします。
>>11
[15] 実体タグはクッキーの代用として濫用されることがあり、 fingerprinting vector とみなされています >>2624。
Entity tags are used for comparing two or more entities from the same requested resource. HTTP/1.1 uses entity tags in the ETag (section
14.2014.19), If-Match (section14.2514.24), If-None-Match (section 14.26), and If-Range (section 14.27) header fields. The definition of how they are used and compared as cache validators is in section 13.3.3. An entity tag consists of an opaque quoted string, possibly prefixed by a weakness indicator.
実体札は、要求された同じ資源からの2つ以上の実体群を比較するのに使います。
HTTP/1.1 は実体札を ETag
, If-Match
, If-None-Match
, If-Range
各頭欄で使います。
これらの頭欄をキャッシュ検証子としてどう使用・比較するかの定義は13.3.3節にあります。
一つの実体札は、一つの不透明な引用文字列で構成されます。
頭に弱性指示子がつくこともあります。
- entity-tag = [ weak ] opaque-tag
- weak = "W/"
- opaque-tag = quoted-string
A "strong entity tag"
mayMAY be shared by two entities of a resource only if they are equivalent by octet equality.
「強い実体札」は、一つの資源の二つの実体がオクテット比較で同等である場合に限って両実体で共有しても構いません。
A "weak entity tag," indicated by the "W/" prefix,
mayMAY be shared by two entities of a resource only if the entities are equivalent and could be substituted for each other with no significant change in semantics. A weak entity tag can only be used for weak comparison.
「弱い実体札」は、 W/
という接頭辞で示します。
一つの資源の二つの実体が同等であり、意味上重大な変更を加えてしまうことなしに互いに代替することができるのであれば、
両実体で共有しても構いません。弱い実体札は弱い比較の時だけ使うことができます。
An entity tag MUST be unique across all versions of all entities associated with a particular resource. A given entity tag value
mayMAY be used for entities obtained by requests on different URIswithout implying anything about the equivalence of those entities. The use of the same entity tag value in conjunction with entities obtained by requests on different URIs does not imply the equivalence of those entities.
実体札は、特定の資源に関連付けられているすべての実体のすべての版に渡って固有なものでなければなりません。
ある実体札値は、それらの実体の同等性について何ら暗示することなしに、
異なる URI についての要求群で得られる実体群について使用しても構いません。異なる URI についての要求群で得られる実体に同じ実体札値が使われていても、それらの実体が同等であることを暗示するわけではありません。
[16] RFC 3229 は HTTP RFC の用語は複雑であるとして新たに「実現値」 なる概念を導入し、実体タグは実体ではなく実現値に対して割り当てられた識別子であるとしました >>12, >>14。
[7] RFC 723x 世代ではHTTP実体という概念が消失していますが、 実体タグという用語はそのまま残っています。「実体」とは何なのかの説明はありません。
[36] Apache では実体札の算出に、当該ファイルの inode 番号, 大きさ, mtime を使っています。 Etag: "19ebd-86f-a5f83ea5" のような値が得られます。この計算方法は 1.x と 2.x で微妙に違うようです。
[37] >>36 参考 [Apache-Users 2282], [Apache-Users 2287]
ETagの文字列はmod_perlのset_etagメソッド内部で呼び出される Apacheのap_make_etag()関数で生成されています。この関数はファ イルに対するリクエストの場合
- ファイルのinode番号
- ファイルのファイルサイズ
- ファイルの更新時刻
の情報を"-"で連結した文字列を生成し、ファイルに対するリクエ ストではない場合は
- ap_set_last_modified()などでセットした更新時刻
の文字列を生成します。
なのでファイルへのアクセスを処理するコンテンツハンドラであ れば、「他のスタティックなコンテンツ」と同じ形式のETagが生 成されますが、ファイルの実体を持たないコンテンツハンドラの 場合は最終更新日だけをつかったETagが生成されます。 と、これはset_etagメソッドでETagを設定する場合で、 set_etagメソッドを使わずに自分でETagを生成・セットすること もできます。
% perl -e 'printf q{"%x-%x-%x"}, (stat("/docs/charset.html"))[1,7,9]' > ;; 詳しくは$APACHE_SRC/main/http_protocol.cのap_set_etag()と ap_make_etag()を見てください。
[57] If-Match:
と If-None-Match:
では *
という値が使われることがありますが、これは実体タグではありません。
[2] 実体タグは内容折衝によって同じ URL で複数の表現が提供されている場合や、
鯖の時計が正しくない場合などでも Last-Modified:
の値に頼らずキャッシュを更新できる仕組みとして HTTP/1.1
で導入されました。
[3] 内容折衝など必要以上に複雑な仕組みが HTTP に導入されたことで、 実体タグのような本来必要なかった複雑な仕組みを更に導入する必要が生じたと見ることもできます。
[4] ETag:
が現在使われるのは、ほとんどの場合、静的ファイルを提供する形の鯖だけですが、
そのような形態なら普通 Last-Modified:
と
If-Modified-Since:
で十分実用的に動作するので、
実体タグはプロトコルを複雑化する以外に役に立っていないとすら言えます。
[5] ETag: (>>17) のように、実体タグの設定の誤りによりキャッシュ効率がむしろ悪化する事例もあります。
[6] また >>15 のように実体タグを悪用する例もあります。
[2625] ETagをどう生成するか - 岩本隆史の日記帳 ( ( 版)) <http://d.hatena.ne.jp/IwamotoTakashi/20080826/p2>
[2626] ETagを使ってSpringとHibernateの転送量と負荷を削減する ( ( 版)) <http://www.infoq.com/jp/articles/etags>
[2627] ricollab Web Tech Blog » Blog Archive » ETagについて ( ( 版)) <http://blogs.ricollab.jp/webtech/2008/02/etag/>
[2628] 2.2.5.4 ETag ( ( 版)) <http://msdn.microsoft.com/en-us/library/dd541486.aspx>
[2629] ビューの条件付き処理 — Django 1.4 documentation ( ( 版)) <http://docs.djangoproject.jp/en/latest/topics/conditional-view-processing.html>
"
の間には 0x80-0xFF もobs-text
として認められています >>11。明記されていませんが、これらは生成は禁止しつつ、 受信者は対応しなければならないという意図と推察されます。