apache静态文件缓存的一些配置

在web应用中,合理利用缓存很重要。对于静态文件css/js/image/html等,可以使用http缓存。

每个浏览器都自带了 HTTP 缓存实现功能。您只需要确保每个服务器响应都提供正确的 HTTP 标头指令,以指示浏览器何时可以缓存响应以及可以缓存多久。

一般常用的会用Exprise,Last_Modified等头信息控制缓存。Cache-Control 标头是在 HTTP/1.1 规范中定义的,取代了之前用来定义响应缓存策略的标头(例如 Expires)。所有现代浏览器都支持 Cache-Control,因此,使用它就够了。

  • 每个资源都可通过 Cache-Control HTTP 标头定义其缓存策略
  • Cache-Control 指令控制谁在什么条件下可以缓存响应以及可以缓存多久

具体有一盘文章可以参考,http缓存,这儿就不多细说了。

既然缓存这么重要,那么服务器怎么配置很关键。这儿又有个常见服务器配置文件标准范例,找到你的服务器,参照着配置就行。

从上面来看,主要就两个标志很重要,Cache-Control和Etag,apache如何去配合使用这两个特性呢,假如我的根目录 的所有的css/js/image等静态文件都需要一个月的缓存,而且需要配合Etag的特性去保持更新。

首先看Cache-Control如何设置,在http.conf或者.htaccess(如果允许),加上一点代码:

<IfModule mod_headers.c>
    <File ~ "./(gif|jpg|jpeg|png|css|js)$">
          Header set Cache-Control  "max-age=2592000,public"
    </File>
</IfModule>

意思是说,如果加载了mod_headers这个模块,匹配文件以jpg,css,js等结尾的,在响应头内加上Cache-Control选项,缓存一个月(其实应该按照需求去设置)。用正则匹配的话可以使用FileMatch容器。

先看看不加这段代码。访问一张图片是怎样响应的

可以看到,响应里并没有cache-control,然后我们加上设置,重启,再访问一次看看

已经有了,一个月的缓存时间,很好。

cahce-control已经有了,还剩个Etag,其实apache默认就支持Etag,不用去设置,浏览器也会自动发送If-None-Match头去验证,很多工作都是自动的,但是它也有一些不同的生产方法。

apache支持FileEtag这个命令,官方介绍,它的参数主要有:INode,Size,Mtime,All,None

Inode是指每个文件的在文件系统里的i-node,Mtime指文件上次修改的时间,Size指大小,None就是不在响应里加上Etag标志。All就是FileEtag INode MTime Size

一般不用Inode,因为默认的ETag使用到的Innode会导致相同的文件在分布式服务器上产生的ETag不同。

看上图,我们访问后,产生的Etag : 303f-556eb6039b504,能看出来只使用了两个属性,如果我们想使用All去生成,那么可以:

<Direcrtory doucment_root>
     FileEtag All
</Directory>

重启,在访问一次,

很好发生变化了。变成 “9000000007bd9-303f-556eb6039b504″,显然多了一个。

平常开发中,可能会有不一样的需求,每个文件都可能需要不一样的缓存策略。

杂文一篇,有错望指出。

 

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注