怎样设置静态内容缓存时间
我们的网站中往往包含大量的页面组件,比如图片、样式表文件、JS脚本文件和Flash动画。这些组件的变化频率非常低,尤其是那些构成网站基本框架的组件, 几乎不会发生变化。我们可以将这些变化率很低的组件看作静态内容,并且通过max-age或expires标识设置缓存过期的时间,以便下次更快的访问,节约带宽资源,节省服务器资源、提高用户体验等。
【怎样设置静态内容缓存时间】 apache配置:\u0026lt;IfModule mod_expires.c\u0026gt; ExpiresActive On ExpiresByType image/gif A2592000 ExpiresByType image/jpeg A2592000 ExpiresByType image/png A2592000 ExpiresByType image/x-icon A2592000 ExpiresByType application/x-javascript A604800 ExpiresByType text/css A604800\u0026lt;/IfModule\u0026gt;或者\u0026lt;ifmodule mod_expires.c\u0026gt; \u0026lt;filesmatch "\\.(jpg|gif|png|css|js)$"\u0026gt; ExpiresActive on ExpiresDefault "access plus 600 minutes" \u0026lt;/filesmatch\u0026gt;\u0026lt;/ifmodule\u0026gt;
可以选用的时间参数有years months weeks days hours minutes seconds
也可以加在.htaccess文件:
#Expire Header\u0026lt;FilesMatch "\\.(ico|jpg|jpeg|png|gif|js|css|swf)$"\u0026gt; ExpiresDefault "access plus 2 hours"\u0026lt;/FilesMatch\u0026gt;or# Expire images headerExpiresActive OnExpiresDefault A0ExpiresByType image/gif A2592000ExpiresByType image/png A2592000ExpiresByType image/jpg A2592000ExpiresByType image/jpeg A2592000ExpiresByType image/ico A2592000ExpiresByType text/css A2592000ExpiresByType text/javascript A2592000#A2592000 means 1 month in the future (60*60*24*30=2592000)nginx配置: location ~* ^.+\\.(jpg|jpeg|gif|png|swf|rar|zip|css|js|flv|mp3|wma|wmv|ram|rm)$ { valid_referers none blocked *.http://www.wannuoda.com/; if ($invalid_referer) { #rewrite ^/ http://www.wannuoda.com/ static/logo.png; #return 412; return 403; } access_log off; root /opt/www; expires 10h; break; }或者 location ~ \\.(gif|jpg|png|swf|flv|bmp)$ { valid_referers none blocked *.http://www.wannuoda.com/; if ($invalid_referer) { #rewrite ^/ http://www.wannuoda.com/ static/logo.png; return 403; } expires 30d; } location ~ .*\\.(js|css)?$ { expires 3d; } 测试:curl -I http://www.wannuoda.com/ static/logo.pngHTTP/1.1 200 OKServer: Apache/2.0.63Date: Tue, 21 Jun 2011 08:13:06 GMTContent-Type: image/gifContent-Length: 21734Last-Modified: Tue, 21 Jun 2011 08:11:00 GMTConnection: keep-aliveExpires: Thu, 21 Jul 2011 08:13:06 GMTCache-Control: max-age=2592000Accept-Ranges: bytesEtag和Expires的工作原理
在客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应同时记录相关属性标记(Http Reponse Header),服务器端的返回状态会是200,格式类似如下:HTTP/1.1 200 OKDate: Tue, 03 Mar 2009 04:58:40 GMTContent-Type: image/jpegContent-Length: 83185Last-Modified: Tue, 24 Feb 2009 08:01:04 GMTCache-Control: max-age=2592000Expires: Thu, 02 Apr 2009 05:14:08 GMTEtag: “5d8c72a5edda8d6a:3239″客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应并记录相关记录属性标记文件没有发生改动,服务器端返回304,直接从缓存中读取:HTTP/1.x 304 Not ModifiedDate: Tue, 03 Mar 2009 05:03:56 GMTContent-Type: image/jpegContent-Length: 83185Last-Modified: Tue, 24 Feb 2009 08:01:04 GMTCache-Control: max-age=2592000Expires: Thu, 02 Apr 2009 05:14:08 GMTEtag: “5d8c72a5edda8d6a:3239″其中Last-Modified、Expires和Etag是标记页面缓存标识一、Last-Modified、Expires和Etag相关工作原理1、Last-Modified在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记(Http Reponse Header)此文件在服务期端最后被修改的时间,格式类似这样:Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头(Http Request Header),询问该时间之后文件是否有被修改过:If-Modified-Since: Tue, 24 Feb 2009 08:01:04 GMT如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。注:如果If-Modified-Since的时间比服务器当前时间(当前的请求时间request_time)还晚,会认为是个非法请求2、Etag工作原理HTTP 协议规格说明定义ETag为“被请求变量的实体标记”。简单点即服务器响应时给请求URL标记,并在HTTP响应头中将其传送到客户端,类似服务器端返回的格式:Etag: “5d8c72a5edda8d6a:3239″客户端的查询更新格式是这样的:If-None-Match: “5d8c72a5edda8d6a:3239″如果ETag没改变,则返回状态304。即:在客户端发出请求后,Http Reponse Header中包含 Etag: “5d8c72a5edda8d6a:3239″标识,等于告诉Client端,你拿到的这个的资源有表示ID:5d8c72a5edda8d6a:3239。当下次需要发Request索要同一个URI的时候,浏览器同时发出一个If-None-Match报头( Http Request Header)此时包头中信息包含上次访问得到的Etag: “5d8c72a5edda8d6a:3239″标识。If-None-Match: “5d8c72a5edda8d6a:3239“,这样,Client端等于Cache了两份,服务器端就会比对2者的etag。如果If-None-Match为False,不返回200,返回304 (Not Modified) Response。3、Expires给出的日期/时间后,被响应认为是过时。如Expires: Thu, 02 Apr 2009 05:14:08 GMT需和Last-Modified结合使用。用于控制请求文件的有效时间,当请求数据在有效期内时客户端浏览器从缓存请求数据而不是服务器端. 当缓存中数据失效或过期,才决定从服务器更新数据。4、Last-Modified和ExpiresLast-Modified标识能够节省一点带宽,但是还是逃不掉发一个HTTP请求出去,而且要和Expires一起用。而Expires标识却使得浏览器干脆连HTTP请求都不用发,比如当用户F5或者点击Refresh按钮的时候就算对于有Expires的URI,一样也会发一个HTTP请求出去,所以,Last-Modified还是要用的,而 且要和Expires一起用。5、Etag和Expires如果服务器端同时设置了Etag和Expires时,Etag原理同样,即与Last-Modified/Etag对应的Http Request Header:If-Modified-Since和If-None-Match。我们可以看到这两个Header的值和Web Server发出的Last-Modified,Etag值完全一样;在完全匹配If-Modified-Since和If-None-Match即检查完修改时间和Etag之后,服务器才能返回304.
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 沈阳全员检测:已设置1549个检测点64万余人检测结果均阴性
- 互联网怎样解决“家政服务上门速度慢”的问题
- 怎样看待从1月8号起,QQ钱包开始提现收费
- 银行it人怎样转型
- 汽车|冬天怎样让车内温度快速升高?座椅加热的最佳使用方式二,外循环的作用总结
- 禁停标志|南通市沿河路终点路段设置禁停标志,附近有车族存异议?
- 怎样进入通信行业
- 怎样评价扶他柠檬茶的小说《云养汉》的结尾
- 怎样成为一名合格的Python程序员?
