HTTP请求缓存配置及原理

1. 方式一:不发送请求,直接使用缓存文件 
(1.1)原理
浏览器通过url请求文件时,若被请求的文件在客户端有缓存,则检查已缓存的时间是否过期,若未过期,则不会发送请求到服务器,而直接获取客户端缓存的文件,否则发送请求到服务器请求文件。
(1.2)实现
服务返回给浏览器文件时,向文件头添加Expires或Cache-Control属性,设置文件缓存期限。
(1.2.1)方法一:若web应用为JSP,可在web应用中增加一个Filter,在Filter中为返回客户端的数据流追加Expires或Cache-Control属性。
(1.2.2)方法二:若web服务器为apache,可通过mod_headers和mod_expires模块的配置来实现
(1.2.2.1)确保apache已加载了mod_headers.so和mod_expires.so,即apache安装目录中的module文件夹里有mod_deflate.so和mod_headers.so文件,并且httpd.conf文件中有如下代码:(使用expires需加上ExpiresActive On)

LoadModule headers_module modules/mod_headers.so
LoadModule expires_module modules/mod_expires.so

(1.2.2.1)向httpd.conf文件中添加Header或Expires代码,例:
添加下列代码实现“服务器返回给客户端的所有文件都缓存1个月(2592000秒)”:

Header set Cache-Control "max-age=2592000"

添加下列代码实现“服务器返回给客户端的所有文件的缓存期限为格林尼治时间2008-12-01 16:00:00”:

Header set Expires "Thu, 01 Dec 2008 16:00:00 GMT"

添加下列代码实现“服务器返回给客户端的所有css文件都缓存1个月15天2小时”:

ExpiresActive On
ExpiresByType text/css "access plus 1 month 15 days 2 hours"


2. 方式二:发送请求,选择性使用缓存文件 
(2.1)原理
浏览器通过url请求文件时,若被请求的文件在客户端有缓存,浏览器会向服务器发出请求,并对比客户端缓存文件与服务器端文件的Etag或Last-Modified值,若相同,则服务器只返回304编码,不返回被请求的文件,因此客户端使用缓存的文件,否则服务器向客户端发送200编码与新文件。
(2.2)实现
apache和tomcat发送到客户端的文件头中默认都包含Etag与Last-Modified。
对与apache,若要在文件头中不包含Etag,可在httpd.conf中添加 FileETag None ,若要在文件头中不包含Last-Modified,可在httpd.conf中添加 Header unset Last-Modified 。

3. 其它说明 
缓存设置的优先级为:Cache-Control > Expries > Etag > Last-Modified,因此当需要实现方式二的“Etag,Last-Modified”的缓存功能时,注意不要与方式一的“Expires,Cache-Control”并用,因为并用时,浏览器始终都不会向服务器发送请求,那么“Etag ,Last-Modified”的配置就失去了意义。
以上配置都是针对web服务器上的所有文件或一类文件生效,可通过与FilesMatch或LocationMatch匹配使用来限定配置所生效的文件范围。但FileETag与FilesMatch配置只对apache上的静态文件有效,对部署在与apache实现了集群的其它应用服务器上的文件无效。

例:服务器返回给客户端的所有请求路径包含/extjs/的文件都缓存1个月(2592000秒)

<LocationMatch "/extjs/"> 
Header set Cache-Control "max-age=2592000"
Header unset Last-Modified 
</LocationMatch>

 

posted @ 2015-07-28 22:21  蓼椮  阅读(444)  评论(0编辑  收藏  举报