登录 | 实名认证,暂停注册 | 在线情况 | 搜索 | 帮助
茗香茶楼百家争茗技术交流网页缓存设置
    
 
网页缓存设置
发起人:孙帅  回复数:8  浏览数:28024  最后更新:2011/2/14 11:24:06 by 孙帅

选择查看 搜索更多相关主题  帖子排序:
2010/9/15 10:14:46
孙帅





中级茶艺师

角  色:茶楼经理
发 帖 数:526
经 验 值:1008
注册时间:2008/7/11
网页缓存设置

一般地,我们要查看Internet网上的一个网页,那么当您第一次访问这个网页的时候,系统首先要将这个网页下载到您的本地计算机的一个临时文件夹中进行缓存,当在一定的时间内,您第二次、第三次来访问这个网页的时候,浏览器就直接从您的本地计算机的临时文件夹中读取这个文件显示,这样做的好处就是避免每次都要重新下载而占用大量的时间和网络资源,不得不说页面的缓存加快了网页的显示,当然也有它的坏处,例如当服务器上的网页己经更新,而本地显示的还是没有更新的网页,这样就不能及时的显示更新后的内容,在某些情况下,我们需要禁止浏览器缓存,以使我们每次看到的页面都是最新的页面(例如后台操作、大型网站的实时新闻页面),这时我们就要禁用浏览器缓存,下面分别说明了在四种不同的页面环境下来禁止网页缓存:

一、对于静态页:

可以利用<meta>标记符的另一种用法来实现,其用法为:

<meta http-equiv="Pragma" content="no-cache">

特别说明:有很多人问到,这样设置了没有用,网页仍有缓存,那是因为您没有设置页面过期时间的原因,您必须同时指定当前页面的过期时间,例如:
<meta http-equiv="expires" content="Wed, 23 Aug 2006 12:40:27 UTC" />
这里的meta标签用来定义页面过期时间为:2006年8月23日 20:40:27(北京时间)
需要特别注意的是content的值必须是一个UTC格式的标准时间或者GMT时间(由于GMT时间己过时,所以建议用UTC标准格式),如果您要让网页立即过期,您可以设置一个过期时间远小于现在的时间,例如:
Mon,1 Jan 2001 0:0:0 UTC

二、对于ASP页面:

可利用以下语句下实现:

<%
Response.Buffer=true                '打开缓存。指明输出页面是否被缓冲,当属性值为True时,服务器将不会向客户端发送任何信息,直到所有程序执行完或者遇到<% Response.Flush %>或<% Response.End %>语句,才会释放缓冲区的信息。
Response.CacheControl="no-cache"    '禁止代理服务器缓存本页面。设置属性为"Public"即可打开代理缓存内容的功能
Response.Expires=-1000              '让页面立即过期(数值为分钟,设置Response.Expires为负数或者0,就禁止了缓存。)
%>

对属性Response.ExpiresAbsolute的设置,允许指定在一个特殊时间到来时内容过期。
  < % Response.ExpiresAbsolute = #May 31,2001 13:30:15# % >
除了使用Response对象来设置到期时间,还可以在HTML文件头部写< META >标记。尽管代理不会注意到这个标记,但是一些浏览器可以。
  < META HTTP-EQUIV="Expires" VALUE="May 31,2001 13:30:15" >
对于HTTP代理,使用Response.CacheControl可以指示是否缓存内容。设置属性为“Public”,打开代理缓存内容的功能。
  < % Response.CacheControl = "Public" % >
默认情况下,这个属性是设置成“Private”的。注意:不要让代理缓冲那些显示给特定用户的页面,因为代理可能会将属于其他用户的页面送给当前用户。

Response的Buffer属性虽然能够提高页面显示速度,但是也要分什么情况。如果你正在制作一个普通的个人主页,访问量不是很高,并且没有什么复杂的执行程序,那么用不用这个属性就不是很重要,因为将数据缓冲也需要一段时间,只不过我们感觉不到罢了;但是如果你正在制作一个大型论坛或者一个产品展示或其他的商务站点,并且访问量很高,那么我建议在程序的第一行加入
<% Response.Buffer = True %>
这句话,因为这样能够让客户在有效的时间内获得更多的数据。

  默认情况下,ASP禁止了浏览器和代理的缓冲功能。如果有一个每次都不要更新的页面,就应该打开浏览器和代理的缓冲,这将允许浏览器和代理在一段时间内使用该页面的“缓冲”拷贝数据。缓冲能够大大地减轻服务器的数据转载量,并提高用户的浏览性能。
  哪些类别的动态页面适合被缓存呢?下面是一些例子:
  天气页面,每5分钟更新一次
  新闻或版本列表页面,每天更新2次
  注意:使用浏览器或者代理缓存后,对Web服务器的点击次数就会减少。如果想精确地了解所有页面,就不适于使用浏览器和代理缓存了。

三、对于JSP页面:
<%
if (request.getProtocol().compareTo("HTTP/1.0")==0)
      response.setHeader("Pragma","no-cache");
if (request.getProtocol().compareTo("HTTP/1.1")==0)
      response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
%>

四、对于PHP页面:

<?php
    header ("Cache-Control: no-cache, must-revalidate");
    header ("Pragma: no-cache");
?>

说明:对于动态页面,缓存的代码必须放在任何HTML标签输出之前,否则将会出错。

祝福 CCTV5在线直播 你是哪个公主 生日礼物 繁体字转换 阿拉丁神灯 免费领养QQ宠物猪 爱的烟花 我心永恒
2010/9/15 10:54:43
孙帅





中级茶艺师

角  色:茶楼经理
发 帖 数:526
经 验 值:1008
注册时间:2008/7/11
在服务器设置缓存,实现断网浏览
在服务器IIS网站属性的“HTTP头”标签中,勾选“启用内容过期”选项,单选“立即过期”、“此时间段后过期”、“过期时间”,可设置缓存过期类型。如果设置为数日或数月过期,则在此期间即使断网,用户端也会利用自身缓存照常浏览。
祝福 CCTV5在线直播 你是哪个公主 生日礼物 繁体字转换 阿拉丁神灯 免费领养QQ宠物猪 爱的烟花 我心永恒
2010/9/15 10:57:41
孙帅





中级茶艺师

角  色:茶楼经理
发 帖 数:526
经 验 值:1008
注册时间:2008/7/11
服务器网页缓存的深入分析
   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 month”
ExpiresByType text/js “now plus 2 day”
ExpiresByType image/jpeg “access plus 2 month”
ExpiresByType image/bmp “access plus 2 month”
ExpiresByType image/x-icon “access plus 2 month”
ExpiresByType image/png “access plus 2 month”
对于动态页面,如果在页面内部没有通过函数强制加上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(NotModify);如果有更新,返回HTTP 200和更新的页面内容,并且携带新的”ETag”和”LastModified”。
    使用这个机制,能够避免重复发送文件给浏览器,不过仍然会产生一个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字段。

三种典型web服务器Header设置内容过期方法
一、Internet 信息服务 (IIS)的内容过期设置
如果IIS 网站中有时间敏感信息,可以配置设置来保证过期信息不被代理服务器或 Web 浏览器缓存。可以配置网站内容,使之在任
何的时间自动过期。当启用内容过期时,Web 浏览器将比较当前日期和截止日期,以便决定是显示缓存页还是从服务器请求更新的页
。Microsoft ASP.NET 这样的服务器端技术可用于动态更改提供的内容。通常,时间敏感信息只限于单个文件、目录或网站;不过,您也可以为某台计算机上的所有网站设置内容过期。
必须是本地计算机上 Administrators 组的成员或者必须被委派了相应的权限,才能执行下列步骤。作为安全性的最佳操作,请使用不属于 Administrators 组的帐户登录计算机,然后使用运行方式命令以管理员身份运行 IIS管理器
在命令提示符下,键入 runas /user:administrative_accountname "mmc %systemroot%\system32\inetsrv\iis.msc"。
设置网站内容的过期时间
1. 在 IIS 管理器中,展开本地计算机;右键单击要设置内容过期的网站、虚拟目录或文件,然后单击“属性”。
2. 单击“HTTP 头”选项卡。
3. 选中“启用内容过期”复选框。
4. 单击“立即过期”、“此时间段后过期”或“过期时间”,然后在对应的框中输入所需的过期信息。
5. 单击“确定”。

二、APACHE服务的内容过期设置
Apache配置摘录及解释
i. 过期相关设置
LoadModule headers_module modules/mod_headers.so
#Load 修改header的模块。
LoadModule expires_module modules/mod_expires.so
#Load 设定过期header的模块。
Header append Via: CCN-BJ-4-502
#增加一个Via header,值配置成设备的hostname。
KeepAliveTimeout 60
#设置连接的保持时间为60秒。
ExpiresActive On
#启用过期header功能。
ExpiresDefault A604800
#缺省过期时间为“访问后的604800秒”

<Directory /data/download>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
ExpiresByType text/html A300
#text/html类型文件的过期设置为“访问后的300秒”
ExpiresByType text/css A259200
#text/css类型文件的过期设置为“访问后的259200秒”
ExpiresByType application/x-javascript A300
# application/x-javascript类型文件的过期设置为“访问后的300秒”
ExpiresByType image/gif A2592000
#image/gif类型文件的过期设置为“访问后的2592000秒”
ExpiresByType application/x-shockwave-flash A2592000
# application/x-shockwave-flash类型文件的过期设置为“访问后的2592000秒”
</Directory>
上述配置文件中load的两个模块:mod_headers.so  和mod_expires.so 可以让Apache具有对header的一些定制功能。
ExpiresByType:     表示按照文件类型-MIME-TYPE设定过期策略;
A300: 表示在Access后300秒后过期;
ExpiresByType text/css A2592000:    表示Mime type是text/css的文件,在Access后2592000秒过期。
ExpiresDefault A604800:  表示除了单独制定的文件类型等过期策略外的其他内容,按照这个缺省的策略设定:访问后604800秒过期。
上面的方法可以实现根据web发布的不同文件类型,针对不同的发布目录进行过期策略设置。在按照如上方法设置后,Apache会自动的产生两个相关的http header,举例如下:
HTTP/1.1 200 OK
Date: Tue, 27 Mar 2007 17:44:21 GMT
Server: Apache/2.0.54 (Unix)
Last-Modified: Thu, 25 Jan 2007 07:45:45 GMT
ETag: “72df3a-93-99499c40”
Accept-Ranges: bytes
Content-Length: 147
Cache-Control: max-age=2592000
Expires: Thu, 26 Apr 2007 17:44:21 GMT
Via: CCN-BJ-4-575
Keep-Alive: timeout=60, max=100
Connection: Keep-Alive
Content-Type: image/gif
Length: 147 [image/gif]
  其中:Date + Max-age = Expires.  Max-age是个时间长度,对应web server上面设置的过期时间;Expires是根据max-age算出来的过期时间点,两者是一致的,不同cache在判断内容是否过期时会严格比较系统时间和上述过期时间,或者比较age(在cache中存住的时间长度)和max-age的值。

三、lighttpd
lighttpd默认是没有开启expire模块的,需要我们在使用是手工开启这个模块支持。把mod_expire前面的“#”号去掉。
# vi  /usr/local/lighttpd/etc/lighttpd.conf
                                "mod_expire",

设定过期时间
    * 设定指定url的过期时间:
expire.url = (
       "/images/" => "access 3 hours",
       "/admin/" => "access 3 hours",
       "/area/" => "access 3 hours",
       "/calendar/" => "access 3 hours",
       "/common/" => "access 3 hours",
       "/front/" => "access 3 hours",
       "/inc/" => "access 3 hours",
       "/jeditor/" => "access 3 hours",
       "/js/" => "access 3 hours",
       "/script/" => "access 3 hours",
       "/theme/" => "access 3 hours",
       "/upload/" => "access 3 hours",
       "/view/" => "access 3 hours",
       "/help/" => "access 3 hours",
       "/htm/" => "access 5 minutes"
       )
设置Etag
在配置文件中增加,etag.use-inode="disable"(i节点不参与etag的运算),保证多台服务器生成的Etag值一致。
祝福 CCTV5在线直播 你是哪个公主 生日礼物 繁体字转换 阿拉丁神灯 免费领养QQ宠物猪 爱的烟花 我心永恒
2011/2/10 20:54:32
togood





有空来坐坐

角  色:注册用户
发 帖 数:3
经 验 值:3
注册时间:2011/2/10
楼主您好,我正好想实现服务器设置缓存,实现断网浏览这样的效果,我是个新手,看的不太明白,请问虚拟主机能实现这样的功能吗.
祝福 CCTV5在线直播 你是哪个公主 生日礼物 繁体字转换 阿拉丁神灯 免费领养QQ宠物猪 爱的烟花 我心永恒
2011/2/10 22:33:46
孙帅





中级茶艺师

角  色:茶楼经理
发 帖 数:526
经 验 值:1008
注册时间:2008/7/11

togood:
楼主您好,我正好想实现服务器设置缓存,实现断网浏览这样的效果,我是个新手,看的不太明白,请问虚拟主机能实现这样的功能吗.
我用的是合租服务器,没有设置权限,以前也没弄过服务器!

我在ASP页面里是这样实现的:
<%
Response.Buffer = True
Response.CacheControl="Public"
Response.ExpiresAbsolute = Date()+10
%>
页面最前端加入这段代码就是10天缓存,可以自行设置。但在IE6浏览器里无法缓存图片和JS,其他浏览器没发现异常。
IE6浏览器里无法缓存图片和JS的问题应该和服务器设置有关,我试过在页面中插入百度、新浪等网站的图片,这些图片可以缓存,我自己的图片无法缓存。后来找了一些个人网站的图片插入到页面里测试,有的在IE6浏览器里可以缓存有的不可以。因为没有服务器设置权限,就没再深究。

祝你成功!

祝福 CCTV5在线直播 你是哪个公主 生日礼物 繁体字转换 阿拉丁神灯 免费领养QQ宠物猪 爱的烟花 我心永恒
2011/2/11 9:14:28
togood





有空来坐坐

角  色:注册用户
发 帖 数:3
经 验 值:3
注册时间:2011/2/10
我的网页是纯html的,加了这段代码好像不行,是不是不同格式的网页实现的方法也不同,非常感谢您的指点!
祝福 CCTV5在线直播 你是哪个公主 生日礼物 繁体字转换 阿拉丁神灯 免费领养QQ宠物猪 爱的烟花 我心永恒
2011/2/11 11:42:07
孙帅





中级茶艺师

角  色:茶楼经理
发 帖 数:526
经 验 值:1008
注册时间:2008/7/11

第一贴第一条就是针对静态页面的,只是需要专门设定缓存过期时间,有些麻烦:
<meta http-equiv="expires" content="Fri, 11 Mar 2011 11:40:27 UTC" />
meta标签定义页面过期时间为:2011年3月11日 19:40:27
需要特别注意的是content的值必须是一个UTC格式的标准时间。

祝福 CCTV5在线直播 你是哪个公主 生日礼物 繁体字转换 阿拉丁神灯 免费领养QQ宠物猪 爱的烟花 我心永恒
2011/2/14 0:12:38
togood





有空来坐坐

角  色:注册用户
发 帖 数:3
经 验 值:3
注册时间:2011/2/10

哈哈,向楼主汇报一下试验结果.

我在网页上加上这段代码
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="expires" content="Fri, 11 Mar 2021 11:40:27 UTC" />
打开页面一些时间后再断开网线打开页面显示该页无法显示

我在页面上只加第二句代码
<meta http-equiv="expires" content="Fri, 11 Mar 2021 11:40:27 UTC" />
这时再断网打开页面可以显示网页文字和框架,但打开的速度好慢,要好几秒钟,ie6下图片不能显示.

按说是两句代码才是完整的,有点晕了,请楼主点评一下,谢谢哈!

祝福 CCTV5在线直播 你是哪个公主 生日礼物 繁体字转换 阿拉丁神灯 免费领养QQ宠物猪 爱的烟花 我心永恒
2011/2/14 11:24:06
孙帅





中级茶艺师

角  色:茶楼经理
发 帖 数:526
经 验 值:1008
注册时间:2008/7/11

我也不太懂,互相切磋共同提高吧。
第一贴第一条有说明,<meta http-equiv="Pragma" content="no-cache">是禁止缓存的。
设置缓存后,打开速度不应该像你说的那么慢吧?断网打开和刷新都不超过一秒。如果是空间故障,打开也不超过一秒,但刷新往往很慢,可能是浏览器必须确定空间无法连接后才开始启用缓存的缘故。

祝福 CCTV5在线直播 你是哪个公主 生日礼物 繁体字转换 阿拉丁神灯 免费领养QQ宠物猪 爱的烟花 我心永恒
用户在线信息
当前查看此主题的会员: 1 人。其中注册用户 0 人,访客 1 人。


  • 关于本站 版权声明 联系本站 意见建议 大事记
    Powered by BBSXP 2008 MSSQL © 1998-2024 Yuzi.Net
  • Processed in 0.05 second(s)
    Server Time 2024/3/29 18:14:29