~存协商
现在我们需要将用户的浏览器也纳入我们构建网站各个缓存层ơ中的其中一个重要层ơ,|站信息和内容在由web服务器生成,而将q些信息和内容作ZD二q制的文件作为本地缓存文件存攑֜用户的浏览器Q是两个独立个体共同完成的Q务,所以两者之间需要一U沟通的机制Q也是HTTP的缓存协?br />
Last-Modified和If-Modified-Since协商
Last-Modified和If-Modified-Since分别位于响应头信息和h头信息中Q都是记录请求的面最后的修改旉
在第一ơ访问web服务器会q回200状态,q在览器的响应头Last-Modified上写上此面最后修改的旉?br />
使用firebugq行查看

在再ơ访问时Q浏览器会把W一ơ返回Last-Modified的时间戳记录到If-Modified-SinceQƈ作ؓh头信息发送到服务区,web服务器会通过If-Modified-Since上的旉x判断用户的页面是否是最新的Q如果不是最新的Q则q回新的面q修改响应头Last-Modified旉戳给用户Q如果判断是最新的Q则q回304状态ƈ告诉览器本地的cache面是最新的Q浏览器可以直接加蝲本地面Q这样可以减网l上传输的数据,q且也减服务器的负担?br />

q里需要注意的是,HTTP协议中规定用的是GMT旉(格林威治)Q而我们国家用的是GMT+8的时_所以我们从firebug中看到的旉是比我们早了8个小Ӟ不过q没关系Q它q不影响到缓存的Ҏ工作
Etag协商
如果我们的一个文件存攑֜多台web服务器上Q用Lh在这些服务器上之间轮询,实现负蝲均衡Q那些这个文件在各台web服务器的最后修Ҏ间很可能是不一Pq样用户每次h到的web服务器都可能是不同,Last-Modified和If-Modified-Since则无法对应,D每次都需要重新获取内容,q时候采用直接标记内容的Etag法Q就可以避免上述的问?br />
Etag是由Web服务器生成的Q如ApacheZ个静态文件新增响应头?br />
Etag "e3af4060-5-472bedf076880"
览器获得这个Etag后,便会在下ơ请求该面Ӟ在HTTP的请求头附上If-None-Match "e3af4060-5-472bedf076880"Q与web服务器上的Etag值相比较Q如果是相同的话Q便q回304状态,不同则重新返回新面信息

当然啦,q里要指出浏览器~存只针对HTML和HTMq行而动态文件则无法~存Q浏览器q不在乎你的文g是否动态还是静态,览器只认准和web服务器通讯的HTTP协商Q所以只要动态页面HTTP头信息包含的~存协商信息Q动态内容也是可以一栯览器进行缓存的Q和静态页面无什么两P只是你确定你需要这样做Q让动态页面被~存Q?br />
以下是对一个jspq行写头信息
response.addHeader("Last-Modified",DateUtl.format(new java.util.Date())+" GMT");
response.addHeader("ETag","e3af4060-5-472bedf076880");
同样Q这样两个设|会写入览器的响应_q个动态文件跟静态文件一样会被浏览器~存
Expires
Expires标记告诉览器该面何时q期Qƈ且在此过期前不需要再讉Kweb服务器,直接使用本地的缓存文件即可,q样h响应头都不需要,实节省了带宽和服务器的开销Q但是就页面在web服务器上更新后在Expiresq期前也不会出现在用户面前,I竟是否应该在于我们的实际应用和取舍
下面是Apache中提供的mod_expires模块
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A600
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A604800
ExpiresByType text/css A604800
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType text/plain A86400
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType video/x-flv A2592000
ExpiresByType application/pdf A2592000
ExpiresByType text/html A600
</IfModule>
或?br />
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 12 hours"
ExpiresByType text/html "access plus 3 days"
ExpiresByType text/plain "access plus 3 days"
ExpiresByType text/css "access plus 7 days"
ExpiresByType image/gif "access plus 30 days"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/jpeg "access plus 30 days"
ExpiresByType image/x-icon "access plus 30 days"
ExpiresByType video/x-flv "access plus 30 days"
ExpiresByType application/x-shockwave-flash "access plus 30 days"
</IfModule>
我们在jsp文g也可以指定expires的过期时?br />
response.addHeader("Expires",DateUtl.format(new java.util.Date())+" GMT");

当然啦,你再h也不会返?04状态,因ؓ览器已l不用想web服务器发?br />
----------------------------------------
by 陈于?
Mail: chenyz@corp.netease.com
参考文?br />
郭欣 《构建高新能web站点?br />
中文?《HTTP协议(RFC2616)?br />

]]>