如何设置静态内容缓存时间

如何设置静态内容缓存时间,第1张

著作权归作者所有。

商业转载请联系作者获得授权,非商业转载请注明出处。

作者:闫生

链接:https://wwwzhihucom/question/23444351/answer/26110856

来源:知乎

我们的网站中往往包含大量的页面组件,比如、样式表文件、JS脚本文件和Flash动画。这些组件的变化频率非常低,尤其是那些构成网站基本框架的组件, 几乎不会发生变化。我们可以将这些变化率很低的组件看作静态内容,并且通过max-age或expires标识设置缓存过期的时间,以便下次更快的访问,节约带宽资源,节省服务器资源、提高用户体验等。

apache配置:

<IfModule mod_expiresc>

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

</IfModule>

或者

<ifmodule mod_expiresc>

<filesmatch "\(jpg|gif|png|css|js)$">

ExpiresActive on

ExpiresDefault "access plus 600 minutes"

</filesmatch>

</ifmodule>

可以选用的时间参数有years months weeks days hours minutes seconds

也可以加在htaccess文件:

#Expire Header

<FilesMatch "\(ico|jpg|jpeg|png|gif|js|css|swf)$">

ExpiresDefault "access plus 2 hours"

</FilesMatch>

or

# Expire images header

ExpiresActive On

ExpiresDefault A0

ExpiresByType image/gif A2592000

ExpiresByType image/png A2592000

ExpiresByType image/jpg A2592000

ExpiresByType image/jpeg A2592000

ExpiresByType image/ico A2592000

ExpiresByType text/css A2592000

ExpiresByType text/javascript A2592000

#A2592000 means 1 month in the future (60602430=2592000)

nginx配置:

location ~ ^+\(jpg|jpeg|gif|png|swf|rar|zip|css|js|flv|mp3|wma|wmv|ram|rm)$ {

valid_referers none blocked http://wwwwannuodacom/;

if ($invalid_referer) {

#rewrite ^/ http://wwwwannuodacom/ static/logopng;

#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://wwwwannuodacom/;

if ($invalid_referer) {

#rewrite ^/ http://wwwwannuodacom/ static/logopng;

return 403;

}

expires 30d;

}

location ~ \(js|css)$

{

expires 3d;

}

测试:

curl -I http://wwwwannuodacom/ static/logopng

HTTP/11 200 OK

Server: Apache/2063

Date: Tue, 21 Jun 2011 08:13:06 GMT

Content-Type: image/gif

Content-Length: 21734

Last-Modified: Tue, 21 Jun 2011 08:11:00 GMT

Connection: keep-alive

Expires: Thu, 21 Jul 2011 08:13:06 GMT

Cache-Control: max-age=2592000

Accept-Ranges: bytes

Etag和Expires的工作原理

在客户端通过浏览器发出第一次请求某一个URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应同时记录相关属性标记(Http Reponse Header),服务器端的返回状态会是200,格式类似如下:

HTTP/11 200 OK

Date: Tue, 03 Mar 2009 04:58:40 GMT

Content-Type: image/jpeg

Content-Length: 83185

Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT

Cache-Control: max-age=2592000

Expires: Thu, 02 Apr 2009 05:14:08 GMT

Etag: “5d8c72a5edda8d6a:3239″

客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送报头(Http Request Header),服务器端响应并记录相关记录属性标记文件没有发生改动,服务器端返回304,直接从缓存中读取:

HTTP/1x 304 Not Modified

Date: Tue, 03 Mar 2009 05:03:56 GMT

Content-Type: image/jpeg

Content-Length: 83185

Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT

Cache-Control: max-age=2592000

Expires: Thu, 02 Apr 2009 05:14:08 GMT

Etag: “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和Expires

Last-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

thinkphp内置了静态缓存的功能,并且支持静态缓存的规则定义。

要使用静态缓存功能,需要开启html_cache_on 参数,并且使用html_cache_rules配置参数设置静态缓存规则文件 。

静态规则的定义方式如下:

'html_cache_on'=>true,

'html_cache_rules'=> array(

'actionname' => array('静态规则', '静态缓存有效期', '附加规则'),

'modulename(小写)' => array('静态规则', '静态缓存有效期', '附加规则'),

'modulename(小写):actionname' => array('静态规则', '静态缓存有效期', '附加规则'),

'' => array('静态规则', '静态缓存有效期', '附加规则'),

//…更多操作的静态规则

)

静态缓存文件的根目录在html_path 定义的路径下面,并且只有定义了静态规则的操作才会进行静态缓存,注意,静态规则的定义有三种方式:

第一种是定义全局的操作静态规则,例如定义所有的read操作的静态规则为

'read'=>array('{id}','60')

其中,{id} 表示取$_get['id'] 为静态缓存文件名,第二个参数表示缓存60秒

第二种是定义全局的模块静态规则,例如定义所有的user模块的静态规则为

'user:'=>array('user/{:actio

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 如何设置静态内容缓存时间

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情