diff options
author | Artyom Liou <artyomliou@gmail.com> | 2021-04-30 15:52:39 +0800 |
---|---|---|
committer | Irvin <irvinfly@gmail.com> | 2021-05-01 17:21:52 +0800 |
commit | f54f14458c6097c49a571d620620c8e3180c068d (patch) | |
tree | a078755d78b83ddc8796e2000727f46fd2d98a43 /files/zh-tw | |
parent | b0b225dce1707ceda83a9b2779d4de971f2be78a (diff) | |
download | translated-content-f54f14458c6097c49a571d620620c8e3180c068d.tar.gz translated-content-f54f14458c6097c49a571d620620c8e3180c068d.tar.bz2 translated-content-f54f14458c6097c49a571d620620c8e3180c068d.zip |
web/http/headers/etag (zh-TW translation)
Diffstat (limited to 'files/zh-tw')
-rw-r--r-- | files/zh-tw/web/http/headers/etag/index.html | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/files/zh-tw/web/http/headers/etag/index.html b/files/zh-tw/web/http/headers/etag/index.html new file mode 100644 index 0000000000..8090a0ccf8 --- /dev/null +++ b/files/zh-tw/web/http/headers/etag/index.html @@ -0,0 +1,122 @@ +--- +title: ETag +slug: Web/HTTP/Headers/ETag +tags: + - HTTP + - Reference + - Response + - header +--- +<div>{{HTTPSidebar}}</div> + +<p><strong><code>ETag</code></strong> 是 HTTP 回應標頭,用來標誌資源的版本。它可以使快取機制更有效率並節省頻寬, + 畢竟資料沒有變動的話,伺服器就不需要再次傳回整份資料。 + 而且,它還可以用來預防多人同步更新資料時覆蓋掉彼此的資料(<a href="#avoiding_mid-air_collisions">"mid-air collisions"</a>)。</p> + +<p>如果一個網址的資源有更新,就<em>必須</em>重新產生它的 <code>Etag</code> 值。 + 比較前後版本的 ETag 就能知道資源有沒有變化,所以 Etags 的作用就跟指紋一樣。有些伺服器便會把它用在追蹤用途上,而且可能會永久保存這些資訊。</p> + +<table class="properties"> + <tbody> + <tr> + <th scope="row">Header type</th> + <td>{{Glossary("Response header")}}</td> + </tr> + <tr> + <th scope="row">{{Glossary("Forbidden header name")}}</th> + <td>no</td> + </tr> + </tbody> +</table> + +<h2 id="Syntax">Syntax</h2> + +<pre class="brush: html">ETag: W/"<etag_value>" +ETag: "<etag_value>" +</pre> + +<h2 id="Directives">Directives</h2> + +<dl> + <dt><code>W/</code> {{optional_inline}}</dt> + <dd><code>'W/'</code> (區分大小寫)表示資源使用 <a + href="/en-US/docs/Web/HTTP/Conditional_requests#weak_validation">Weak etags</a>。 + Weak etags 很容易產生,但較不適合用在版本比對;Strong etags 很難有效率的產生,但很適合用在版本比對。 + 同一資源的兩個 weak etags 一致時,可以視為是同個版本,但其內容並非分毫不差。 + 比如說 weak etags 可以用在 <a + href="/en-US/docs/Web/HTTP/Headers/Accept-Ranges">byte range requests</a> 上預防快取,不過帶有 strong etags 的請求仍然可能被快取住。</dd> + <dt>"<etag_value>"</dt> + <dd>代表資源的版本。它的格式是由雙引號包著的 ASCII 字元組成的,像是: <code>"675af34563dc-tr34"</code>。 + 產生 <code>ETag</code> 值的方式沒有一定。不過通常會是資料的 hash 值、最後修改時間的 hash 值,或者是版本號。 + 比如說,MDN 就是使用 wiki 文章的十六進位內文 hash 值。</dd> +</dl> + +<h2 id="Examples">範例</h2> + +<pre>ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4" +ETag: W/"0815"</pre> + +<h3 id="Avoiding_mid-air_collisions">避免空中碰撞</h3> + +<p>有了 <code>ETag</code> 以及 {{HTTPHeader("If-Match")}} 標頭,你可以偵測空中碰撞。</p> + +<p>比如說,在進入 wiki 編輯頁時,當下可以把內文的 hash 值放到 HTTP 回應中的 <code>Etag</code> 標頭:</p> + +<pre>ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"</pre> + +<p>當儲存更新時, {{HTTPMethod("POST")}} 請求就會有一個 {{HTTPHeader("If-Match")}} 標頭,其值為 <code>ETag</code> + 的值,這樣便可以用來檢查資料新鮮度。</p> + +<pre>If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"</pre> + +<p>如果 hash 沒有對上,就代表文件已經在你的編輯過程中,被別人先修改了,便會回傳 + {{HTTPStatus("412")}} <code>Precondition Failed</code> 錯誤。</p> + +<h3 id="Caching_of_unchanged_resources">快取沒更新過的資源</h3> + +<p>另一個 <code>ETag</code> 標頭的好用處是用來快取沒更新過的資源。如果一位使用者再次造訪一個網址(而且前一次有設定 <code>ETag</code>),而資源已經<em>過期</em>了(舊到不能用), + 則客戶端會把 <code>ETag</code> 的值放在 {{HTTPHeader("If-None-Match")}} 標頭內傳送:</p> + +<pre>If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"</pre> + +<p>伺服器會比對客戶端傳來的 <code>ETag</code> (放在 <code>If-None-Match</code> 標頭中) 與該資源在伺服器上的現有版本的 <code>ETag</code> 值,如果兩者一樣(代表沒更新過), + 伺服器便會傳回 {{HTTPStatus("304")}} <code>Not Modified</code> 狀態且不帶資料, + 這就可以讓客戶端知道自己快取住的版本仍然可用(可視為是<em>新鮮的</em>)。</p> + +<h2 id="Specifications">規格</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">Specification</th> + <th scope="col">Title</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{RFC("7232", "ETag", "2.3")}}</td> + <td>Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests</td> + </tr> + </tbody> +</table> + +<h2 id="Browser_compatibility">瀏覽器相容性</h2> + +<div class="hidden">The compatibility table in this page is generated from structured + data. If you'd like to contribute to the data, please check out <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a> + and send us a pull request.</div> + +<p>{{Compat("http.headers.ETag")}}</p> + +<h2 id="See_also">See also</h2> + +<ul> + <li>{{HTTPHeader("If-Match")}}</li> + <li>{{HTTPHeader("If-None-Match")}}</li> + <li>{{HTTPStatus("304")}}<code> Not Modified</code></li> + <li>{{HTTPStatus("412")}}<code> Precondition Failed</code></li> + <li> + <p><a href="https://www.w3.org/1999/04/Editing/">W3C Note: Editing the Web – Detecting + the Lost Update Problem Using Unreserved Checkout</a></p> + </li> +</ul> |