在 Blog 盛行的今天,一些 Web 应用需要解析大量的 RSS Feed .如何提高效率是个非常重要的问题.在 MagpieRSS 的 Features 中列举了这样的一条: HTTP Conditional GETs
Save bandwidth and speed up download times with intelligent use of Last-Modified and ETag.. 这里的 Etag 引起了我的注意.
什么是 Etag ?
通过阅读 RFC 2616 ,得到了对 Etag 的一点印象:
The ETag response-header field provides the current value of the entity tag for the requested variant……Entity tags are normally “strong validators,” but the protocol provides a mechanism to tag an entity tag as “weak.” One can think of a strong validator as one that changes whenever the bits of an entity changes, while a weak value changes whenever the meaning of an entity changes. Alternatively, one can think of a strong validator as part of an identifier for a specific entity,
while a weak validator is part of an identifier for a set of semantically equivalent entities.
从上我们可以大致得知,Entity tags 本质上说是一种”强校验器”,但是 HTTP 协议提供了一种通过给 Entity tags 打标签的”弱”的机制(类似于内容的校验码).虽然这段话后面通过两种方式进行了解释,但是还是有些晦涩.我看了这段话之后只是得出了 Etag 的 “E” 代表 “Entity” 而已.
Magpie 首页上提到了一篇文章: HTTP Conditional Get for RSS Hackers ,拜读之后清晰了许多.要先说说 HTTP Conditional GETs 的基本原理,很简单,就是说,从 Web 服务器取数据的时候,如果文件变化了,给我新的文件,如果文件没有变化,只需告诉客户端没有变化即可,不必再把文件取回来.这样就可节省大量的网络带宽和资源.
Etag 与 Last-Modified 是从 HTTP 1.0 到 HTTP 1.1 才有的概念.当我们从 Web 服务器获取文件的时候,只需要读取 HTTP 响应头的 Etag 与 Last-Modified 字段即可,这两个字段里面的具体内容是什么可以不管(可能会千奇百怪,RFC 2616 对 Etag 没有具体值的定义),把这两个值 Cache 在本地,下次检查文件是否更新的时候比对这两个值即可.如果没有变化,服务器的响应代码不是 HTTP 200 (OK) , 而是 304.
看Lilina源码的时候也注意到了这个问题:
http://www.mengyan.org/blog/archives/2005/08/23/54.html
”
ETags and Last-Modified headers are two ways that feed publishers can save bandwidth, but they only work if clients take advantage of them. Universal Feed Parser gives you the ability to take advantage of these features, but you must use them properly.
The basic concept is that a feed publisher may provide a special HTTP header, called an ETag, when it publishes a feed. You should send this ETag back to the server on subsequent requests. If the feed has not changed since the last time you requested it, the server will return a special HTTP status code (304) and no feed data.
”
我看过你的关于 Lilina 的另一篇文章:如何修改时区 Dissect Lilina 这篇没有挤出时间读.早知道读一下能节省不少时间.
呵呵,这是对于我们RSS Online很有用的标准。
您好,有个问题想请教一下,Etag和过期头是不是两者同时满足未变化才能确定客户端不需要获取服务器文件?
谢谢!
什么情况下会引起ETag改变呢?感觉ETag跟Last-Modified意思差不多,为何要存在2者?