codetc - 网站开发技术 首页 后端 服务器 查看内容

Apache中启用和配置expires

2014-10-30 01:35| 发布者: CODETC| 查看: 4205| 评论: 1

Expires、Cache-Control、Last-Modified、ETag是RFC 2616(HTTP/1.1)协议中和网页缓存相关的几个字段。前两个用来控制缓存的失效日期,后两个用来验证网页的有效性。要注意的是, HTTP/1.0有一个功能比较弱的缓存控制机制:Pragma,使用HTTP/1.0的缓存将忽略Expires和Cache-Control头。我们 这里以Apache2.0服务器为例,只讨论HTTP/1.1协议。

Expires

Expires字段声明了一个网页或URL地址不再被浏览器缓存的时间,一旦超过了这个时间,浏览器都应该联系原始服务器。RFC告诉我们:“由于推断的失效时间也许会降低语义透明度,应该被谨慎使用,同时我们鼓励原始服务器尽可能提供确切的失效时间。”

对于一般的纯静态页面,如html、gif、jpg、css、js,默认安装的Apache服务器,不会在响应头添加这个字段。Firefox浏览 器接受到相应后,如果发现没有Expires字段,浏览器根据文件的类型和“Last-Modified”字段来推断出一个合适的失效时间,并存储在客户 端。推测出的时间一般是接受到响应时间后的三天左右。

Apache的expires_module模块可以在Http响应头部自动加上Expires字段。在Apache的httpd.conf文件中进行如下配置:
#启用expires_module模块
LoadModule expires_module modules/mod_expires.so
# 启用有效期控制
ExpiresActive On
# GIF有效期为1个月
ExpiresByType image/gif A2592000
# HTML文档的有效期是最后修改时刻后的一星期
ExpiresByType text/html M604800
#以下的含义类似
ExpiresByType text/css "now plus 2 months"
ExpiresByType text/js "now plus 2 days"
ExpiresByType image/jpeg "access plus 2 months"
ExpiresByType image/bmp "access plus 2 months"
ExpiresByType image/x-icon "access plus 2 months"
ExpiresByType image/png "access plus 2 months"
对于动态页面,如果在页面内部没有通过函数强制加上Expires,例如header(”Expires: ” . gmdate(”D, d M Y H:i:s”) . ” GMT”),Apache服务器会把Wed, 11 Jan 1984 05:00:00 GMT

作为Expires字段内容,返回给浏览器。即认为动态页面总是失效的。而浏览器仍然会保存已经失效的动态页面。

可以发现Firefox浏览器总是缓存所有页面,不管失效、不失效还是没有声明失效时间。即使缓存中声明了一个网页的实效日期是1970-01- 01 08:00:00,浏览器仍然会发送该文件在缓存中的Last-Modified和ETag字段。 如果在服务器端验证通过,返回304状态,浏览器就还会使用此缓存。

Cache-Control

Cache-Control字段中可以声明多些元素,例如no-cache, must-revalidate, max-age=0等。这些元素用来指明页面被缓存最大时限,如何被缓存的,如何被转换到另一个不同的媒介,以及如何被存放在持久媒介中的。但是任何一个 Cache-Control指令都不能保证隐私性或者数据的安全性。“private”和“no-store”指令可以为隐私性和安全性方面提供一些帮 助,但是他们并不能用于替代身份验证和加密。

Apache的mod_cern_meta模块允许文件级Http响应头部的控制,同时它也可以配置Cache-Control头(或任何其他头)。响应头文件是放在原始目录的子目录中,根据原始文件名所命名的一个文件。具体用法请参阅Apache的官方网站。

其中Cache-Control : max-age表示失效日期。如果没有启动mod_cern_meta模块,Apache服务器会把Expires字段中的日期换算成以秒为单位的一个 delta值,赋值给max-age。如果启动mod_cern_meta模块,并且配置了max-age值,Apache会将这个覆盖Expires字 段。同时,max-age隐含了Canche-Control: public。这样浏览器接受到的Cache-Control : max-age和Expires值就是一致的。

如果失效日期Cache-Control : max-ag=0或者是负值,浏览器会在对应的缓存中把Expires设置为1970-01-01 08:00:00。

Last-Modified

Last-Modified和ETag是条件请求(Conditional Request)相关的两个字段。如果一个缓存收到了针对一个页面的请求,它发送一个验证请求询问服务器页面是否已经更改,在HTTP头里面带上” ETag”和”If Modify Since”头。服务器根据这些信息判断是否有更新信息,如果没有,就返回HTTP 304(Not Modify);如果有更新,返回HTTP 200和更新的页面内容,并且携带新的”ETag”和”Last-Modified”。

使用这个机制,能够避免重复发送文件给浏览器,不过仍然会产生一个HTTP请求。

一般纯静态页面本身都会有Last-Modified信息,Apache服务器会读取页面文件中的Last-Modified信息,并添加到http响应头部。

对于动态页面,如果在页面内部没有通过函数强制加上Last-Modified,例如header(”Last-Modified: ” . gmdate(”D, d M Y H:i:s”) . ” GMT”),Apache服务器会把当前时间作为Last-Modified,返回给浏览器。

无论是纯静态页面还是动态页面,Firefox浏览器巧妙地按照接受到服务器响应的时间设置缓存页面的Last-Modified,而不是按照http响应头部中的Last-Modified字段。

ETag

既然有了Last-Modified,为什么还要用ETag字段呢?因为如果在一秒钟之内对一个文件进行两次更改,Last-Modified就会不正确。因此,HTTP/1.1利用Entity Tag头提供了更加严格的验证。

Apache服务器默认情况下,会对所有的静态、动态文件的响应头添加ETag字段。

在Apache的httpd.conf文件中可以通过FileETag指令配置该选项。FileETag指令配置了当文档是基于一个文件时用以创建 Etag(entity tag)响应头的文件的属性。在Apache 1.3.22及以前,ETag的值是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。 如果一个目录的配置包含了‘FileETag INode MTime Size’而其一个子目录包含了‘FileETag -INode’那么这个子目录的设置(并会被其下任何没有进行覆盖的子目录继承)将等价于‘FileETag MTime Size’。

在多台负载平衡的服务器环境下,同一个文件会有不同的etag或者文件修改日期,浏览器每次都会重新下载。设置‘FileETag None’可以使响应头不再包含ETag字段。

Apache提供了mod_expires.so模块,可以轻松的设置expires值,以下是配置的范例:
LoadModule expires_module modules/mod_expires.so
ExpiresActive On
ExpiresDefault "access plus 300 seconds”  #默认300秒过期
<Directory "/var/www/html”>   #文件所在目录
    Options FollowSymLinks MultiViews
    AllowOverride All
    Order allow,deny
    Allow from all
    ExpiresByType text/html "access plus 1 day”  #设置cache时间为1天
    ExpiresByType text/css "access plus 1 day”
    ExpiresByType text/javascript "access plus 1 day”
    ExpiresByType image/gif "access plus 1 day”
    ExpiresByType image/jpg "access plus 1 day”
    ExpiresByType image/png "access plus 1 day”
    ExpiresByType application/x-shockwave-flash "access plus 1 day”
</Directory>
对于同一个操作对象,ExpiresByType比ExpiresDefault优先级高,当expires和max-age同时存在时,max-age的优先级会高于expires.
当你不知道某个文件的MIME类型时,你可以通过浏览器去看httpwatch去看MIME类型.
如果要对某个目录里的某个文件设置Expires头,可以用<filesmatch “正则”></filematch>来匹配.
设置缓存也可以通过mod_headers模块修改cache-control来实现.
header set cache-control "max-age=3600".

以下提供 Apache开启deflate(Gzip)和Expires提升网页加载速度 的配置例子(可直接使用)
在Apache的配置文件中找到下面行,将注释#去掉,重启。
LoadModule deflate_module modules/mod_deflate.so  
LoadModule expires_module modules/mod_expires.so  
LoadModule header_module modules/mod_header.so 
在http.conf后面加上这一段进行定制:(如非必要,用默认的就好了)
<IfModule mod_deflate.c>  
	AddOutputFilterByType DEFLATE text/html text/plain text/css application/x-httpd-php text/javascript application/x-javascript text/css  
	AddOutputFilter DEFLATE js css		#压缩js,css文件  
	# Don’t compress images			#对照片文件不进行压缩处理  
	SetEnvIfNoCase Request_URI (?:gif|jpe?g|png)$ no-gzip dont-vary  
	SetEnvIfNoCase Request_URI (?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary  
	SetEnvIfNoCase Request_URI .pdf$ no-gzip dont-vary  
	#SetEnvIfNoCase Request_URI .(css|js)$ no-gzip dont-vary  
	# Make sure proxies don’t deliver the wrong content  
	Header append Vary User-Agent env=!dont-vary  
	DeflateCompressionLevel 6  
	SetOutputFilter DEFLATE  
</IfModule>  
<IfModule mod_expires.c>  
	ExpiresActive On  
	ExpiresByType text/css "now plus 1 month”  
	ExpiresByType application/x-javascript "now plus 5 day”  
	ExpiresByType image/jpeg "access plus 1 month”  
	ExpiresByType image/gif "access plus 1 month”  
	ExpiresByType image/bmp "access plus 1 month”  
	ExpiresByType image/x-icon "access plus 1 month”  
	ExpiresByType image/png "access plus 1 month”  
	ExpiresByType application/x-shockwave-flash "access plus 1 month”  
</IfModule>  
如果使用mod_headers,在.htaccess文件中添加如下内容也可以实现缓存:
<ifmodule mod_headers.c>  
	# htm,html,txt类的文件缓存一个小时  
	<filesmatch “/.(html|htm|txt)$”>  
		header set cache-control “max-age=3600″  
	</filesmatch>  
	# css, js, swf类的文件缓存一个星期  
	<filesmatch “/.(css|js|swf)$”>  
		header set cache-control “max-age=604800″  
	</filesmatch>  
	# jpg,gif,jpeg,png,ico,flv,pdf等文件缓存一年  
	<filesmatch “/.(ico|gif|jpg|jpeg|png|flv|pdf)$”>  
		header set cache-control “max-age=29030400″  
	</filesmatch>  
</ifmodule> 
这样可以压缩一般网页中会用到的html、xml、php、css、js等格式档案输出,虽然会占用掉服务器处理器的一点点处理器时间,浏览者在接收 网页数据时也会消耗极短暂的一点点处理器时间,不过却可以大幅减少数据传输量,减少网络带宽被吃掉的情形。
DeflateCompressionLevel 9是指压缩程度的等级,从1到9,9是最高等级。据了解,这样做最高可以减少8成大小的传输量(看档案内容而定),最少也能够节省一半。
DeflateCompressionLevel 预设可以采用 6 这个数值,以维持耗用处理器效能与网页压缩质量的平衡。

mod_expires、mod_headers具体语法格式定义,请参考《Apache参考手册》
文章来源 CODETC,欢迎分享,转载请注明地址: http://www.codetc.com/article-21-1.html
发表评论

最新评论

查看全部评论(1)

 作为游客发表评论,请输入您的昵称

返回顶部